@journeykit/canon 0.26.0 → 0.28.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 +245 -89
- package/dist/skills/reference/brief-align.md +4 -2
- package/dist/skills/reference/brief-clarify.md +7 -5
- package/dist/skills/reference/brief-harden.md +4 -2
- package/dist/skills/reference/brief-polish.md +7 -5
- package/dist/skills/reference/brief-shape.md +4 -2
- package/dist/skills/reference/canon-artifact-ingest.md +11 -7
- package/dist/skills/reference/canon-authoring.md +16 -2
- package/dist/skills/reference/canon-context.md +21 -11
- package/dist/skills/reference/canon-fmt.md +10 -2
- package/dist/skills/reference/canon-gate.md +119 -83
- package/dist/skills/reference/canon-inventory.md +34 -22
- package/dist/skills/reference/canon-learn.md +23 -19
- package/dist/skills/reference/canon-plan-import.md +10 -7
- package/dist/skills/reference/canon-plugins.md +15 -8
- package/dist/skills/reference/canon-policy.md +20 -16
- package/dist/skills/reference/canon-report-dashboard.md +30 -19
- package/dist/skills/reference/canon-retrieve.md +13 -10
- package/dist/skills/reference/canon-review.md +96 -68
- package/dist/skills/reference/canon-session-ingest.md +7 -3
- package/dist/skills/reference/canon-storage.md +82 -51
- package/dist/skills/reference/canon-subject.md +123 -84
- package/dist/skills/reference/canon-vocab.md +1 -1
- package/dist/skills/reference/role-implementer.md +295 -64
- package/dist/skills/reference/role-orchestrator.md +547 -55
- package/dist/skills/reference/role-planner.md +189 -32
- package/dist/skills/reference/role-reviewer.md +257 -58
- package/dist/skills/scripts/canon-retrieve-pre-dispatch.sh +10 -5
- package/man/canon-adapter-authorize.1 +44 -0
- package/man/canon-adapter-validate.1 +44 -0
- package/man/canon-adapter.1 +46 -0
- package/man/canon-artifacts-move.1 +63 -0
- package/man/canon-artifacts-store.1 +54 -0
- package/man/canon-artifacts-verify.1 +48 -0
- package/man/canon-artifacts.1 +45 -0
- package/man/canon-brief-approve.1 +62 -0
- package/man/canon-brief-check.1 +44 -0
- package/man/canon-brief-show.1 +50 -0
- package/man/canon-brief.1 +63 -0
- package/man/canon-change-new.1 +66 -0
- package/man/canon-change.1 +42 -0
- package/man/canon-completion.1 +60 -0
- package/man/canon-context-pack-add.1 +47 -0
- package/man/canon-context-pack-show.1 +44 -0
- package/man/canon-context-pack-verify.1 +44 -0
- package/man/canon-context-pack.1 +50 -0
- package/man/canon-context.1 +44 -0
- package/man/canon-dashboard.1 +50 -0
- package/man/canon-demo-init.1 +44 -0
- package/man/canon-demo-review.1 +44 -0
- package/man/canon-demo.1 +47 -0
- package/man/canon-dispatch-begin.1 +80 -0
- package/man/canon-dispatch-diff.1 +41 -0
- package/man/canon-dispatch-end.1 +60 -0
- package/man/canon-dispatch.1 +45 -0
- package/man/canon-divergence-accept.1 +68 -0
- package/man/canon-divergence-add.1 +97 -0
- package/man/canon-divergence-defer.1 +71 -0
- package/man/canon-divergence-list.1 +56 -0
- package/man/canon-divergence-resolve.1 +68 -0
- package/man/canon-divergence.1 +51 -0
- package/man/canon-evidence-add.1 +168 -0
- package/man/canon-evidence-approval-payload.1 +65 -0
- package/man/canon-evidence-audit.1 +121 -0
- package/man/canon-evidence.1 +57 -0
- package/man/canon-export.1 +108 -0
- package/man/canon-feature-new.1 +62 -0
- package/man/canon-feature.1 +39 -0
- package/man/canon-finding-add.1 +196 -0
- package/man/canon-finding-close.1 +117 -0
- package/man/canon-finding-list.1 +59 -0
- package/man/canon-finding.1 +67 -0
- package/man/canon-format.1 +49 -0
- package/man/canon-gate-check.1 +44 -0
- package/man/canon-gate-install-hooks.1 +59 -0
- package/man/canon-gate-promote.1 +62 -0
- package/man/canon-gate.1 +50 -0
- package/man/canon-ingest-plans.1 +53 -0
- package/man/canon-ingest-records.1 +56 -0
- package/man/canon-ingest-sessions.1 +62 -0
- package/man/canon-ingest.1 +50 -0
- package/man/canon-init.1 +98 -0
- package/man/canon-inventory-sync.1 +50 -0
- package/man/canon-inventory.1 +39 -0
- package/man/canon-ledger-compact.1 +50 -0
- package/man/canon-ledger.1 +54 -0
- package/man/canon-migrate.1 +89 -0
- package/man/canon-plugin-sync.1 +53 -0
- package/man/canon-plugin.1 +39 -0
- package/man/canon-policy-approve.1 +50 -0
- package/man/canon-policy-show.1 +41 -0
- package/man/canon-policy.1 +52 -0
- package/man/canon-prompt-add.1 +47 -0
- package/man/canon-prompt-show.1 +41 -0
- package/man/canon-prompt.1 +43 -0
- package/man/canon-purge.1 +70 -0
- package/man/canon-query.1 +111 -0
- package/man/canon-regime-show.1 +50 -0
- package/man/canon-regime.1 +39 -0
- package/man/canon-report-build.1 +44 -0
- package/man/canon-report-check.1 +41 -0
- package/man/canon-report-snapshot.1 +47 -0
- package/man/canon-report.1 +45 -0
- package/man/canon-retrieve.1 +56 -0
- package/man/canon-review-change.1 +98 -0
- package/man/canon-review-scenario.1 +98 -0
- package/man/canon-review.1 +42 -0
- package/man/canon-scenario-new.1 +80 -0
- package/man/canon-scenario.1 +39 -0
- package/man/canon-schema.1 +63 -0
- package/man/canon-selftest.1 +69 -0
- package/man/canon-skills-check.1 +47 -0
- package/man/canon-skills-doctor.1 +47 -0
- package/man/canon-skills-install.1 +53 -0
- package/man/canon-skills-show.1 +104 -0
- package/man/canon-skills.1 +48 -0
- package/man/canon-status.1 +51 -0
- package/man/canon-strategy-approval-payload.1 +53 -0
- package/man/canon-strategy-promote.1 +59 -0
- package/man/canon-strategy-rollback.1 +62 -0
- package/man/canon-strategy.1 +45 -0
- package/man/canon-subject-adopt.1 +53 -0
- package/man/canon-subject-move.1 +80 -0
- package/man/canon-subject-new.1 +65 -0
- package/man/canon-subject-show.1 +44 -0
- package/man/canon-subject-unadopt.1 +63 -0
- package/man/canon-subject.1 +51 -0
- package/man/canon-task-done.1 +47 -0
- package/man/canon-task.1 +42 -0
- package/man/canon-tier-age.1 +50 -0
- package/man/canon-tier.1 +39 -0
- package/man/canon.1 +169 -0
- package/package.json +9 -5
|
@@ -5,7 +5,7 @@ that anyone other than the author looked at the work. Canon records that
|
|
|
5
5
|
second look as two ledger kinds — a **Finding** per issue a reviewer
|
|
6
6
|
raises, and a **Review** per scenario a reviewer signs off — and the
|
|
7
7
|
opt-in `spec_coverage.require_review` policy makes `canon gate check` and
|
|
8
|
-
`canon subject
|
|
8
|
+
`canon subject move` hold a subject until both are in order.
|
|
9
9
|
|
|
10
10
|
Both records are attestations: canon never checks a finding's summary
|
|
11
11
|
against the code, or that a reviewer actually read the scenario. What the
|
|
@@ -17,7 +17,8 @@ state they are in.
|
|
|
17
17
|
The order an agent follows to claim a subject done:
|
|
18
18
|
|
|
19
19
|
1. **Test-run evidence** per owned scenario (`canon evidence add
|
|
20
|
-
--scenario-id <id> --project-id <root-id>
|
|
20
|
+
--scenario-id <id> --project-id <root-id> --session-id <session>` and the
|
|
21
|
+
rest of its options;
|
|
21
22
|
final when it returns under `write: { promote: auto }`, which
|
|
22
23
|
`canon init` writes, and followed by `canon gate promote` only under
|
|
23
24
|
`write.promote: manual`). See `canon-gate`.
|
|
@@ -26,11 +27,11 @@ The order an agent follows to claim a subject done:
|
|
|
26
27
|
|
|
27
28
|
```bash
|
|
28
29
|
canon finding add --change-id c-demo --round 1 --seq 1 \
|
|
29
|
-
--severity blocker --disposition open --
|
|
30
|
+
--severity blocker --disposition open --actor-id reviewer-2 \
|
|
30
31
|
--summary "unbounded subprocess wait" --session-id review-session-1
|
|
31
32
|
# ... fix, commit ...
|
|
32
|
-
canon finding close
|
|
33
|
-
--disposition fixed --resolution-
|
|
33
|
+
canon finding close c-demo --round 1 --seq 1 \
|
|
34
|
+
--disposition fixed --resolution-rev HEAD
|
|
34
35
|
```
|
|
35
36
|
|
|
36
37
|
Under `write.promote: manual` (or no `write:` key), run
|
|
@@ -41,23 +42,27 @@ The order an agent follows to claim a subject done:
|
|
|
41
42
|
the evidence is in (the review pins what it saw):
|
|
42
43
|
|
|
43
44
|
```bash
|
|
44
|
-
canon review
|
|
45
|
-
--
|
|
45
|
+
canon review scenario world.demo.01 --project-id root \
|
|
46
|
+
--actor-id reviewer-2 --role reviewer \
|
|
46
47
|
--session-id review-session-1 \
|
|
47
|
-
--
|
|
48
|
+
--rev HEAD --upstream-ref "pr#41"
|
|
48
49
|
```
|
|
49
50
|
|
|
50
|
-
`review
|
|
51
|
+
`review scenario` writes directly; there is nothing to promote. If the
|
|
51
52
|
reviewer could not reach a verdict, record that instead of signing:
|
|
52
|
-
`--outcome indeterminate` (or `unavailable` when it could not run).
|
|
53
|
+
`--review-outcome indeterminate` (or `unavailable` when it could not run).
|
|
53
54
|
Changing the scenario or re-attesting it afterwards makes the review
|
|
54
55
|
stale; review it again. A reviewer of user-visible behavior attaches
|
|
55
56
|
the screenshots or recordings it looked at with `--artifact <path>`
|
|
56
57
|
(below).
|
|
57
58
|
|
|
58
|
-
4. **Move the subject**: `canon subject
|
|
59
|
+
4. **Move the subject**: `canon subject move <id> --to verifying`, later
|
|
59
60
|
`shipped`. See `canon-subject`.
|
|
60
61
|
|
|
62
|
+
**Done when:** `canon gate check` exits 0 (no `unreviewed-promotion`, no
|
|
63
|
+
`open-blocker`) and `canon status` shows the subject with every scenario
|
|
64
|
+
reviewed and `openBlockers: 0` (`data.subjects[]`).
|
|
65
|
+
|
|
61
66
|
## `canon finding add` / `canon finding close`
|
|
62
67
|
|
|
63
68
|
A Finding's natural key is `(change_id, round, seq)`: the change under
|
|
@@ -66,14 +71,14 @@ round. `seq` is never auto-assigned; `finding add` refuses an occupied
|
|
|
66
71
|
key, because two different findings under one key are two reviewers'
|
|
67
72
|
work collapsed into one identity.
|
|
68
73
|
|
|
69
|
-
```
|
|
74
|
+
```text
|
|
70
75
|
canon finding add --change-id <c> --round <n> --seq <n> \
|
|
71
76
|
--severity blocker|should-fix|note --disposition open \
|
|
72
|
-
--
|
|
73
|
-
[--
|
|
74
|
-
canon finding close
|
|
75
|
-
--disposition fixed --resolution-
|
|
76
|
-
canon finding close
|
|
77
|
+
--actor-id <who> --summary "<one line>" \
|
|
78
|
+
[--rev <rev>] [--resolution-rev <rev>] [--introduced-rev <rev>] [--file-ref path/to/file.rs:120-134] [--scenario-id <id>] [--session-id <id>]
|
|
79
|
+
canon finding close <c> --round <n> --seq <n> \
|
|
80
|
+
--disposition fixed --resolution-rev <rev> [--actor-id <id>] [--session-id <id>] # or rejected / deferred / open
|
|
81
|
+
canon finding close <c> --round <n> --seq <n> \
|
|
77
82
|
--disposition rejected|deferred --reason "<why, one line>"
|
|
78
83
|
```
|
|
79
84
|
|
|
@@ -101,24 +106,34 @@ appends a second version at the same natural key — the first stays. Its
|
|
|
101
106
|
`--actor-id` and `--session-id` name who authored the transition; the
|
|
102
107
|
raiser's stay on the first version.
|
|
103
108
|
|
|
104
|
-
Every
|
|
105
|
-
takes
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
Every commit option (`--rev`, `--resolution-rev`, `--introduced-rev`)
|
|
110
|
+
takes any git revision (`HEAD~1`, a branch, a tag, a full or short sha),
|
|
111
|
+
resolved with `git rev-parse --verify <rev>^{commit}`; the record stores
|
|
112
|
+
the full sha. `--rev` (the commit the round reviewed) defaults to `HEAD`,
|
|
113
|
+
and so does `--resolution-rev` on a `fixed` close; `--introduced-rev` has
|
|
114
|
+
no default and is only sourced, never guessed. A revision that names no
|
|
115
|
+
commit is refused (exit `2`). A finding recorded against uncommitted code
|
|
116
|
+
is allowed: the record carries the `codeTree` it saw and `worktreeDirty`.
|
|
117
|
+
Outside git, or in a repository with no commit, the write is refused with
|
|
118
|
+
`NO_COMMIT`.
|
|
119
|
+
|
|
120
|
+
Many findings at once: `--input` takes inline JSON, a file or `-`; an array
|
|
121
|
+
(or NDJSON) is a batch validated before any write. Keys are the option
|
|
122
|
+
names in camelCase (`changeId`, `actorId`, `resolutionRev`); `canon schema
|
|
123
|
+
finding add --json` shows the input schema and an example. An identical
|
|
124
|
+
repeat is `unchanged` (`meta.unchanged`) and writes nothing; a different
|
|
125
|
+
finding under an occupied key is `FINDING_SEQ_OCCUPIED`.
|
|
111
126
|
|
|
112
127
|
### A defect the author found in its own work
|
|
113
128
|
|
|
114
129
|
Record it like any other finding, at the moment you find it and before
|
|
115
|
-
review, with `--
|
|
130
|
+
review, with `--actor-id` set to your own id; never ask
|
|
116
131
|
the reviewer to record it later under theirs. Nothing refuses a finding
|
|
117
132
|
whose reviewer is also the implementer, and an open `blocker` the author
|
|
118
133
|
raised blocks under `block_on_findings` exactly like a reviewer's.
|
|
119
|
-
`--introduced-
|
|
120
|
-
found it: `--introduced-
|
|
121
|
-
`--
|
|
134
|
+
`--introduced-rev` names the commit that introduced the defect, not who
|
|
135
|
+
found it: `--introduced-rev self` is a usage error (exit 2) that points at
|
|
136
|
+
`--actor-id`.
|
|
122
137
|
|
|
123
138
|
### Severities
|
|
124
139
|
|
|
@@ -139,7 +154,7 @@ text in the summary, not a field.
|
|
|
139
154
|
| Disposition | Meaning |
|
|
140
155
|
|---|---|
|
|
141
156
|
| `open` | Raised and not yet dealt with. The default on `finding add`; `finding close --disposition open` reopens. |
|
|
142
|
-
| `fixed` | Fixed by a commit.
|
|
157
|
+
| `fixed` | Fixed by a commit. Carries `--resolution-rev <rev>` (default `HEAD`) naming a commit this repo holds; only `fixed` may carry one. |
|
|
143
158
|
| `rejected` | The reviewer's point was considered and declined. Needs `--reason`. |
|
|
144
159
|
| `deferred` | Accepted, but postponed to later work. Needs `--reason`. |
|
|
145
160
|
|
|
@@ -150,55 +165,68 @@ Every reader takes the **latest version per natural key**
|
|
|
150
165
|
uses. A blocker raised `open` and later closed `fixed` counts as fixed; a
|
|
151
166
|
fixed finding reopened with `--disposition open` counts as open again.
|
|
152
167
|
|
|
153
|
-
## `canon review
|
|
168
|
+
## `canon review scenario`
|
|
154
169
|
|
|
155
|
-
```
|
|
156
|
-
canon review
|
|
157
|
-
|
|
158
|
-
--
|
|
159
|
-
|
|
160
|
-
[--outcome signed|indeterminate|unavailable] \
|
|
170
|
+
```text
|
|
171
|
+
canon review scenario <scenario-id> [<scenario-id>] --project-id <root-id> \
|
|
172
|
+
--actor-id <who> [--rev <rev>] --role <role> \
|
|
173
|
+
(--upstream-ref <ref> | --original-spec-ref <ref>) [--session-id <id>] \
|
|
174
|
+
[--review-outcome signed|indeterminate|unavailable] \
|
|
161
175
|
[--reviewer-provider <p>] [--reviewer-model <m>] [--reviewer-harness <h>] \
|
|
162
|
-
[--artifact <path>]
|
|
163
|
-
canon review
|
|
164
|
-
--role reviewer (--upstream-ref <ref> | --original-spec-ref <ref>)
|
|
176
|
+
[--artifact <path>] [--artifact <path>] [--max-artifact-mib <MiB>]
|
|
177
|
+
canon review change <slug> --project-id <root> --actor-id <who> [--rev <rev>] \
|
|
178
|
+
--role reviewer (--upstream-ref <ref> | --original-spec-ref <ref>) # a chore, below
|
|
165
179
|
```
|
|
166
180
|
|
|
167
181
|
One attributed Review record per scenario, joined on
|
|
168
182
|
`(project_id, scenario_id)` — both are required because two spec roots
|
|
169
183
|
may carry the same scenario id. Exactly one provenance ref is required.
|
|
170
|
-
`--actor-id`
|
|
184
|
+
`--actor-id` is the reviewer and is required; `--session-id` fills `actor.session_id`.
|
|
171
185
|
A Review carries no verdict about the behavior; the `verifying → shipped`
|
|
172
186
|
ship gate still refuses missing or `Divergent` evidence verdicts on its
|
|
173
|
-
own (a `Divergent` one passes only while a
|
|
187
|
+
own (a `Divergent` one passes only while a human's `canon divergence
|
|
174
188
|
accept` holds). It is written directly to the ledger, with no staging step, and says
|
|
175
|
-
so: `canon review
|
|
189
|
+
so: `canon review scenario: wrote <path> (new) — written directly; nothing to
|
|
176
190
|
promote`.
|
|
177
191
|
|
|
192
|
+
`--rev` is the commit the review is about: any git revision, default
|
|
193
|
+
`HEAD`. The review records the full sha and the `codeTree` of the code it
|
|
194
|
+
saw (the tree with `.canon/`, the spec roots and `code.exclude` removed), and
|
|
195
|
+
`worktreeDirty` when that code is uncommitted. Reviewing uncommitted code is
|
|
196
|
+
allowed, and the commit made from it has the same code tree, so committing it
|
|
197
|
+
afterwards leaves the review as it was: a review is judged by its pins (the
|
|
198
|
+
scenario and what its evidence says), not by the commit. Outside git, or
|
|
199
|
+
with no commit, the write is refused with `NO_COMMIT`. An identical review
|
|
200
|
+
written again is `unchanged` (`meta.unchanged` under `--json`) and adds no
|
|
201
|
+
record.
|
|
202
|
+
|
|
203
|
+
**Done when:** `canon gate check` reports no `unreviewed-promotion` for the
|
|
204
|
+
scenarios you reviewed; a review that does not count shows up there with
|
|
205
|
+
its reason.
|
|
206
|
+
|
|
178
207
|
### Several scenarios in one call (0.18)
|
|
179
208
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
skipped. One reviewer, pin, provenance ref and set of artifacts cover
|
|
209
|
+
The scenario operand is repeatable, and an `--input` array (see
|
|
210
|
+
`canon schema review scenario`) batches several calls. One reviewer, pin, provenance ref and set of artifacts cover
|
|
183
211
|
every review; each review pins its own scenario and evidence, and each
|
|
184
212
|
gets its own `pinned` and `wrote` line. The artifacts are stored once.
|
|
185
|
-
It is all or nothing: a scenario with no record, or
|
|
213
|
+
It is all or nothing: a scenario with no record, or an operand
|
|
186
214
|
that is not a scenario id, refuses the call (exit 2) and writes no review.
|
|
187
215
|
This is also the batch re-pin after `canon evidence add` reports reviews
|
|
188
216
|
it made stale (see `canon-gate`).
|
|
189
217
|
|
|
190
|
-
### A chore is reviewed as a change (
|
|
218
|
+
### A chore is reviewed as a change (`review change`, 0.23)
|
|
191
219
|
|
|
192
220
|
A chore adds no scenarios, and recording the suite again after it leaves
|
|
193
221
|
every scenario review current (a review pins the evidence's verdict and
|
|
194
222
|
checks, so the same verdicts from the same cases change nothing). What the
|
|
195
223
|
chore needs instead is one change-level review: the reviewer signs its
|
|
196
|
-
invariants and checks against the diff with `canon review
|
|
197
|
-
<slug
|
|
224
|
+
invariants and checks against the diff with `canon review change
|
|
225
|
+
<slug>`, in place of `review scenario`. The review pins the chore's brief
|
|
198
226
|
(its digest, less the `Approved:` line), so an edit to the brief stales it,
|
|
199
227
|
and `--to shipped` refuses a chore with no signed, current change-level
|
|
200
228
|
review (`spec_coverage.require_review.distinct_actor` asks it of a reviewer
|
|
201
|
-
and session that did not attest the subject's evidence).
|
|
229
|
+
and session that did not attest the subject's evidence). `review change` takes a
|
|
202
230
|
chore's slug and refuses a feature change.
|
|
203
231
|
|
|
204
232
|
### What the reviewer looked at (artifacts)
|
|
@@ -218,8 +246,8 @@ review records each distinct file once, in the order given:
|
|
|
218
246
|
"artifacts": [{"path": "reports/title.png", "sha256": "<64 hex>"}]
|
|
219
247
|
```
|
|
220
248
|
|
|
221
|
-
The field is absent when no `--artifact` is given. `review
|
|
222
|
-
`canon review
|
|
249
|
+
The field is absent when no `--artifact` is given. `review scenario` prints
|
|
250
|
+
`canon review scenario: artifact store holds <n> bound file(s) under
|
|
223
251
|
.canon/artifacts/sha256/ (<k> newly stored) — commit them with the
|
|
224
252
|
ledger`.
|
|
225
253
|
|
|
@@ -227,13 +255,13 @@ ledger`.
|
|
|
227
255
|
review (the latest per `(project_id, scenario_id, reviewer)`, unless it
|
|
228
256
|
went stale against its scenario) by the evidence rule (see `canon-gate`,
|
|
229
257
|
"Bound evidence stays provable"). A missing blob whose working-tree file
|
|
230
|
-
still matches is an advisory naming `canon
|
|
258
|
+
still matches is an advisory naming `canon artifacts store`, which stores
|
|
231
259
|
it back. A missing blob with a changed or missing working-tree file, or
|
|
232
260
|
an altered blob, is `stale-evidence` on the review's scenario, naming
|
|
233
261
|
the review:
|
|
234
262
|
|
|
235
263
|
```
|
|
236
|
-
stale-evidence world.demo.01 — review by `reviewer-2` (actor `reviewer-2`, 2026-10-11T09:00:00Z) bound file `reports/title.png` recorded sha256 <hex>; stored blob .canon/artifacts/sha256/<hex>: missing; working tree: <other hex> — the bound bytes are gone, look again and re-record the review with `canon review
|
|
264
|
+
stale-evidence world.demo.01 — review by `reviewer-2` (actor `reviewer-2`, 2026-10-11T09:00:00Z) bound file `reports/title.png` recorded sha256 <hex>; stored blob .canon/artifacts/sha256/<hex>: missing; working tree: <other hex> — the bound bytes are gone, look again and re-record the review with `canon review scenario <scenario-id> --artifact <path>`
|
|
237
265
|
```
|
|
238
266
|
|
|
239
267
|
The reviewer's later review replaces the earlier one, so its files are
|
|
@@ -245,7 +273,7 @@ screenshot shows.
|
|
|
245
273
|
|
|
246
274
|
### What the review saw (pins)
|
|
247
275
|
|
|
248
|
-
`review
|
|
276
|
+
`review scenario` reads the corpus and records `pins` on the review; the
|
|
249
277
|
reviewer never types them:
|
|
250
278
|
|
|
251
279
|
- `scenario_digest` — the scenario record's `scenario_digest`: a sha256
|
|
@@ -268,7 +296,7 @@ reviewer never types them:
|
|
|
268
296
|
verdict from the same checks again leaves the review current. A scenario
|
|
269
297
|
with no evidence yet is pinned with an empty list.
|
|
270
298
|
|
|
271
|
-
It prints `canon review
|
|
299
|
+
It prints `canon review scenario: pinned <id> at scenario digest <12 hex> and the
|
|
272
300
|
verdict and checks of its <n> role(s) of evidence; …` (`at source digest` for
|
|
273
301
|
a file pin). A
|
|
274
302
|
scenario with no record (never synced) is refused with exit 2 and nothing
|
|
@@ -284,15 +312,15 @@ final.
|
|
|
284
312
|
|
|
285
313
|
### The reviewer's outcome and runtime
|
|
286
314
|
|
|
287
|
-
`--outcome` records how the reviewer's run ended: `signed` (the default:
|
|
315
|
+
`--review-outcome` records how the reviewer's run ended: `signed` (the default:
|
|
288
316
|
an approval), `indeterminate` (it ran and reached no verdict) or
|
|
289
317
|
`unavailable` (it could not run). Only `signed` counts; the other two
|
|
290
318
|
are recorded so a failed review is visible, never mistaken for a
|
|
291
|
-
sign-off or a rejection, and `review
|
|
319
|
+
sign-off or a rejection, and `review scenario` says so. `--reviewer-provider`,
|
|
292
320
|
`--reviewer-model` and `--reviewer-harness` record the runtime that
|
|
293
321
|
produced the review, as given. An empty or padded label is a usage error.
|
|
294
322
|
|
|
295
|
-
`--session-id` (on `evidence add`, `review
|
|
323
|
+
`--session-id` (on `evidence add`, `review scenario`, `finding add` and
|
|
296
324
|
`finding close`) takes one opaque token: non-empty, no surrounding
|
|
297
325
|
whitespace, no control characters. Anything else is a usage error
|
|
298
326
|
(exit 2) and nothing is written.
|
|
@@ -361,8 +389,8 @@ A review written before 0.23 pins something the gate no longer compares: a
|
|
|
361
389
|
count until `canon migrate` rewrites it to what the evidence says (see
|
|
362
390
|
`canon-gate`). A review that was current under the rule it was written under
|
|
363
391
|
becomes a current review; one that was stale stays stale, and its scenario
|
|
364
|
-
needs a new `canon review
|
|
365
|
-
reviewer's earlier one. The gate, `canon status` and `canon subject
|
|
392
|
+
needs a new `canon review scenario`, which pins what it saw and replaces the
|
|
393
|
+
reviewer's earlier one. The gate, `canon status` and `canon subject move`
|
|
366
394
|
print one advisory naming how many scenarios are waiting for `canon
|
|
367
395
|
migrate`. In CI, check out full history (`fetch-depth: 0`) for the job that
|
|
368
396
|
runs `canon migrate`, or a pre-0.15 review whose commit is missing is pinned
|
|
@@ -376,7 +404,7 @@ counting: a current signed review failing only `distinct_actor`, then a
|
|
|
376
404
|
stale review, then non-signed outcomes.
|
|
377
405
|
|
|
378
406
|
```
|
|
379
|
-
unreviewed-promotion world.demo.01 — no review record for this scenario; spec_coverage.require_review wants an independent review (`canon review
|
|
407
|
+
unreviewed-promotion world.demo.01 — no review record for this scenario; spec_coverage.require_review wants an independent review (`canon review scenario`) once its subject is claimed done
|
|
380
408
|
```
|
|
381
409
|
|
|
382
410
|
or, when the only reviews are self-reviews:
|
|
@@ -397,13 +425,13 @@ review (`its spec changed`, `its evidence changed`, `its spec and its
|
|
|
397
425
|
evidence changed`):
|
|
398
426
|
|
|
399
427
|
```
|
|
400
|
-
unreviewed-promotion world.demo.01 — stale review by `reviewer-2`: its evidence changed (the latest evidence records are not the pinned ones) since the review; a pinned review counts only while what it saw is current — review it again (`canon review
|
|
428
|
+
unreviewed-promotion world.demo.01 — stale review by `reviewer-2`: its evidence changed (the latest evidence records are not the pinned ones) since the review; a pinned review counts only while what it saw is current — review it again (`canon review scenario`)
|
|
401
429
|
```
|
|
402
430
|
|
|
403
431
|
or, when every latest review recorded no sign-off:
|
|
404
432
|
|
|
405
433
|
```
|
|
406
|
-
unreviewed-promotion world.demo.01 — no signed review: the latest review recorded no sign-off (`reviewer-2` indeterminate); an indeterminate or unavailable review is a gap, never an approval — run the review again and record `--outcome signed`
|
|
434
|
+
unreviewed-promotion world.demo.01 — no signed review: the latest review recorded no sign-off (`reviewer-2` indeterminate); an indeterminate or unavailable review is a gap, never an approval — run the review again and record `--review-outcome signed`
|
|
407
435
|
```
|
|
408
436
|
|
|
409
437
|
A non-signed review is a gap even without `distinct_actor`.
|
|
@@ -416,7 +444,7 @@ subject's `change_ids` (`canon subject adopt`). The subject string is
|
|
|
416
444
|
`<change_id>#<round>.<seq>`:
|
|
417
445
|
|
|
418
446
|
```
|
|
419
|
-
open-blocker c-demo#1.1 — open blocker finding by `reviewer-2` on change `c-demo` (subject `demo-subject`): unbounded subprocess wait; fix it and `canon finding close --
|
|
447
|
+
open-blocker c-demo#1.1 — open blocker finding by `reviewer-2` on change `c-demo` (subject `demo-subject`): unbounded subprocess wait; fix it and `canon finding close <change> --round <n> --seq <n> --disposition fixed`, or close it as rejected or deferred
|
|
420
448
|
```
|
|
421
449
|
|
|
422
450
|
Findings on changes no in-scope subject has adopted do not block.
|
|
@@ -435,11 +463,11 @@ review waivers: 1 advisory(ies) — not failing the gate:
|
|
|
435
463
|
|
|
436
464
|
## The status guard
|
|
437
465
|
|
|
438
|
-
With `require_review` present, `canon subject
|
|
466
|
+
With `require_review` present, `canon subject move <id> --to <state>`
|
|
439
467
|
prints on stderr which review checks it ran or skipped:
|
|
440
468
|
|
|
441
|
-
```
|
|
442
|
-
canon subject
|
|
469
|
+
```stderr
|
|
470
|
+
canon subject move: review guard for building → verifying (spec_coverage.require_review, scope: verifying, shipped)
|
|
443
471
|
ran unreviewed-promotion — every owned scenario needs a signed review, current with the spec and evidence it pinned, by an actor, and from a session, other than its evidence's
|
|
444
472
|
ran open-blocker — 1 adopted change(s) checked for open blocker findings
|
|
445
473
|
```
|
|
@@ -15,7 +15,7 @@ no live database. Swap `hot` to postgres (the commented stanza `canon
|
|
|
15
15
|
init` ships beside the sqlite one) once team-scale multi-agent
|
|
16
16
|
concurrency outgrows sqlite's single-writer mode.
|
|
17
17
|
|
|
18
|
-
## `canon ingest sessions [--watch] [--interval-secs N] [--home <dir>] [--
|
|
18
|
+
## `canon ingest sessions [--watch] [--interval-secs N] [--home <dir>] [--full] [--all-workspaces]`
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
21
|
canon ingest sessions # one pass over this project's sources
|
|
@@ -25,6 +25,10 @@ canon ingest sessions --all-workspaces # machine-wide scan
|
|
|
25
25
|
canon ingest sessions --home /custom # override the scan-root home ($HOME)
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
+
**Done when:** the run summary (below) ends with `malformed records … : 0`
|
|
29
|
+
and `canon query --kind session` lists the sessions; a rerun reports the
|
|
30
|
+
files as `skipped unchanged (watermark)` and writes nothing.
|
|
31
|
+
|
|
28
32
|
## The four adapters
|
|
29
33
|
|
|
30
34
|
Registered in order: **`omp`** (omp/pi sessions), **`hermes`**,
|
|
@@ -179,7 +183,7 @@ canon query --kind event # filter detail.label == "user_directive"
|
|
|
179
183
|
Each pass prints the active scope, one line per adapter, then totals:
|
|
180
184
|
|
|
181
185
|
```
|
|
182
|
-
scope: project /
|
|
186
|
+
scope: project /path/to/repo (2 roots)
|
|
183
187
|
omp: 3 file(s) scanned, 1 reparsed, 2 skipped unchanged (watermark), 4 row(s) parsed, 0 malformed record(s)
|
|
184
188
|
claude-code: 1 file(s) scanned, 0 reparsed, 1 skipped unchanged (watermark), 0 row(s) parsed, 0 malformed record(s)
|
|
185
189
|
sessions normalized: 4
|
|
@@ -208,7 +212,7 @@ events written: 37
|
|
|
208
212
|
|
|
209
213
|
## What this skill does NOT cover
|
|
210
214
|
|
|
211
|
-
- Artifact/verdict ingestion (`canon ingest
|
|
215
|
+
- Artifact/verdict ingestion (`canon ingest records`) — a different
|
|
212
216
|
pipeline; see the `canon-artifact-ingest` skill.
|
|
213
217
|
- Cost-parity computation — omp/pi's own cost is `0.0`/`Unknown` per the
|
|
214
218
|
ported behavior.
|