@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
|
@@ -79,18 +79,22 @@ re-selects the record but the destination write is a no-op. A kind
|
|
|
79
79
|
split across two rungs (some aged, some not) still reads correctly —
|
|
80
80
|
`canon query` fans out.
|
|
81
81
|
|
|
82
|
+
**Done when:** after `canon tier age --commit --plan-digest <digest from the
|
|
83
|
+
preview>`, a bare `canon tier age` previews no effect (`moved` is `0`).
|
|
84
|
+
|
|
82
85
|
## Running `canon tier age` / `canon query`
|
|
83
86
|
|
|
84
|
-
Both
|
|
85
|
-
directory).
|
|
87
|
+
Both read the `canon.yaml` of `--repo <dir>` (default: the nearest ancestor
|
|
88
|
+
directory holding one).
|
|
86
89
|
|
|
87
90
|
```bash
|
|
88
|
-
# Preview what would move (read-only; writes/deletes nothing).
|
|
89
|
-
canon tier age --dry-run
|
|
90
|
-
|
|
91
|
-
# Apply every `aging:` rule once (the destructive move+delete).
|
|
91
|
+
# Preview what would move (the bare run is read-only; writes/deletes nothing).
|
|
92
92
|
canon tier age
|
|
93
93
|
|
|
94
|
+
# Apply every `aging:` rule once (the destructive move+delete), with the
|
|
95
|
+
# `planDigest` the preview printed.
|
|
96
|
+
canon tier age --commit --plan-digest "$PLAN_DIGEST"
|
|
97
|
+
|
|
94
98
|
# Read a kind, fanning out across its routed rung AND its aging
|
|
95
99
|
# destination, merged by time. --kind is the kind wire string — the
|
|
96
100
|
# same vocabulary as routing:/aging: (`change`, `handoff`, …).
|
|
@@ -116,8 +120,8 @@ read the ledger only.
|
|
|
116
120
|
|
|
117
121
|
```bash
|
|
118
122
|
canon query --kind evidence --history # every version, archive included
|
|
119
|
-
canon ledger compact
|
|
120
|
-
canon ledger compact
|
|
123
|
+
canon ledger compact # preview; writes nothing
|
|
124
|
+
canon ledger compact --commit --plan-digest "$PLAN_DIGEST" # pre-0.23 ledger or interrupted move; idempotent; `canon migrate` runs it
|
|
121
125
|
```
|
|
122
126
|
|
|
123
127
|
A crash between the write and the move leaves a readable ledger that the next
|
|
@@ -125,6 +129,9 @@ append or `canon ledger compact` finishes. The archive is local, not routed
|
|
|
125
129
|
through `tiers:`; a `tiers.local.root` whose directory is not named `ledger`
|
|
126
130
|
has no archive and keeps every version.
|
|
127
131
|
|
|
132
|
+
**Done when:** after `canon ledger compact --commit --plan-digest <digest
|
|
133
|
+
from the preview>`, a bare `canon ledger compact` previews no effect.
|
|
134
|
+
|
|
128
135
|
## Where artifact bytes live (`artifact_store:`)
|
|
129
136
|
|
|
130
137
|
```yaml
|
|
@@ -133,40 +140,40 @@ artifact_store: { backend: local } # default
|
|
|
133
140
|
```
|
|
134
141
|
|
|
135
142
|
`local` is `.canon/artifacts/sha256/`, git-tracked and credential-free. An
|
|
136
|
-
object-store tier gets `evidence add`, `review
|
|
143
|
+
object-store tier gets `evidence add`, `review scenario` and `artifacts store`
|
|
137
144
|
uploads under `<prefix>sha256/<digest>` and keeps nothing locally. The gate
|
|
138
145
|
and `canon artifacts verify [--full]` ask the store and refuse, never pass,
|
|
139
|
-
when it cannot be reached. `canon artifacts
|
|
146
|
+
when it cannot be reached. `canon artifacts move --tier <tier>` (a preview; `--commit --plan-digest <digest>` acts)
|
|
140
147
|
uploads, reads back and verifies every local blob, then writes the
|
|
141
148
|
`artifact_store:` block, removes the local copies and ignores
|
|
142
149
|
`.canon/artifacts/`; commit the removals, `.gitignore` and `canon.yaml`. It is
|
|
143
150
|
resumable and a second run finds nothing to do.
|
|
144
151
|
|
|
145
|
-
## What `canon report` does and doesn't read
|
|
152
|
+
## What `canon report build` does and doesn't read
|
|
146
153
|
|
|
147
|
-
canon exposes layered `stg_`/`int_`/`mart_` query views; `canon report`
|
|
154
|
+
canon exposes layered `stg_`/`int_`/`mart_` query views; `canon report build`
|
|
148
155
|
builds its numbers from the `mart_` views. Those read ONLY local roots
|
|
149
156
|
— the git ledger, the sqlite `hot` db file (local, no credential; read
|
|
150
|
-
since 0.18) and a LOCAL `.canon/r2` parquet mirror. `canon report`
|
|
157
|
+
since 0.18) and a LOCAL `.canon/r2` parquet mirror. `canon report build`
|
|
151
158
|
never opens a live DB connection or the live bucket, so:
|
|
152
159
|
|
|
153
|
-
- Kinds routed to a postgres `hot` rung do NOT appear in `canon
|
|
154
|
-
|
|
160
|
+
- Kinds routed to a postgres `hot` rung do NOT appear in `canon report
|
|
161
|
+
build`; kinds routed to `canon init`'s default sqlite `hot` rung do.
|
|
155
162
|
- Kinds routed to `cold` (s3) appear only if a local `.canon/r2` mirror
|
|
156
163
|
has been separately materialized — there is no automatic sync.
|
|
157
164
|
|
|
158
165
|
These kinds are not lost: read them with `canon query --kind <kind>`.
|
|
159
166
|
The gap is named loud, not under-counted — when any routed kind isn't
|
|
160
|
-
report-readable, `canon report` renders a `## Kinds not read directly`
|
|
167
|
+
report-readable, `canon report build` renders a `## Kinds not read directly`
|
|
161
168
|
section listing them and emits a matching stderr `WARN`.
|
|
162
169
|
|
|
163
170
|
## Retention, export, and access audit
|
|
164
171
|
|
|
165
|
-
`canon purge --kind <kind> --before <RFC3339>
|
|
166
|
-
is the canonical data-lifecycle boundary:
|
|
167
|
-
its `planDigest` and deletes nothing; `--
|
|
172
|
+
`canon purge --kind <kind> --before <RFC3339> [--commit --plan-digest <planDigest>] [--repo <dir>] [--json]`
|
|
173
|
+
is the canonical data-lifecycle boundary: the bare run previews: it prints the removal set and
|
|
174
|
+
its `planDigest` and deletes nothing; `--commit --plan-digest <planDigest>` deletes only if
|
|
168
175
|
the plan recomputed now has the same digest (`PLAN_CHANGED`, exit 2, when the
|
|
169
|
-
data moved)
|
|
176
|
+
data moved). The only purgeable kinds are
|
|
170
177
|
`session`, `run`, `event`, and `trajectory`; the cutoff applies to every
|
|
171
178
|
routed rung and every configured aging destination, including retained
|
|
172
179
|
historical versions. For `trajectory`, the command also purges the
|
|
@@ -179,14 +186,19 @@ an explicit `partial` result with matched/deleted counts and a nonzero
|
|
|
179
186
|
status. Purge never rewrites Git history or deletes source transcript
|
|
180
187
|
files.
|
|
181
188
|
|
|
189
|
+
**Done when:** after `canon purge --kind <kind> --before <time> --commit
|
|
190
|
+
--plan-digest <digest from the preview>`, a bare `canon purge` with the same
|
|
191
|
+
arguments previews an empty removal set.
|
|
192
|
+
|
|
182
193
|
With `--json`, `purge` and `export` answer `{ "data", "meta" }` like every other
|
|
183
194
|
command: `data` is the plan or manifest, `meta.next` the step after (a plan's is the
|
|
184
|
-
human's review and `--
|
|
185
|
-
`nextCursor`) sits in `meta`. `export --json --
|
|
186
|
-
file and answers with `data: {
|
|
195
|
+
human's review and `--commit --plan-digest`), and an export's page state (`total`, `returned`,
|
|
196
|
+
`nextCursor`) sits in `meta`. `export --json --output <file>` writes the manifest to the
|
|
197
|
+
file and answers with `data: { output, kind, recordCount }`; `--dry-run`
|
|
198
|
+
answers with what it would write and writes nothing.
|
|
187
199
|
|
|
188
200
|
`canon export --kind <kind> [--before <RFC3339>] [--after <RFC3339>]
|
|
189
|
-
[--
|
|
201
|
+
[--output <file>] [--json] [--limit <n> | --all] [--cursor <c>]` emits a versioned manifest containing source scope,
|
|
190
202
|
counts, digests, and redacted metadata. It does not authorize backend access;
|
|
191
203
|
credentials remain an operator prerequisite. New output files are mode
|
|
192
204
|
`0600`. Raw event detail text is excluded unless `--include-sensitive` is
|
|
@@ -199,7 +211,7 @@ query:
|
|
|
199
211
|
|
|
200
212
|
Every query, export, and purge appends an actor-stamped record to
|
|
201
213
|
`.canon/audit/access.jsonl` (mode `0600` on creation) in the repository
|
|
202
|
-
whose `canon.yaml` it read (through `--repo`
|
|
214
|
+
whose `canon.yaml` it read (through `--repo`), never in
|
|
203
215
|
the current directory; with no `canon.yaml` there is no audit and nothing
|
|
204
216
|
is written. The log is local operator state: `canon init` keeps
|
|
205
217
|
`.canon/audit/` out of git (below). `CANON_ACTOR` takes
|
|
@@ -212,7 +224,7 @@ record bodies.
|
|
|
212
224
|
Four writes stage their record instead of committing it: `canon evidence
|
|
213
225
|
add`, `canon finding add`, `canon finding close` and `canon divergence add`
|
|
214
226
|
(under `.canon/ledger/_staging/`, one staging shape for every kind,
|
|
215
|
-
committed by `canon gate promote`; `canon
|
|
227
|
+
committed by `canon gate promote`; `canon gate promote --kind divergence` commits only
|
|
216
228
|
the staged divergences). `canon divergence resolve|defer|accept` stage and
|
|
217
229
|
promote their own record in the same run. `canon.yaml`'s
|
|
218
230
|
`write:` section decides whether they promote in the same run:
|
|
@@ -240,7 +252,7 @@ line ends ``— run `canon gate promote` to commit it`` (`canon divergence
|
|
|
240
252
|
promote` for a divergence), and the command exits `1`. With neither flag,
|
|
241
253
|
a malformed `write:` section (anything but `promote: auto | manual`)
|
|
242
254
|
refuses the write, exit `2`, before anything is staged. `canon init
|
|
243
|
-
--check
|
|
255
|
+
--check` reports `[PASS] write (promote: auto)`, `[not configured]
|
|
244
256
|
write (promote: manual)`, or `[FAIL] write: …`. `canon gate promote` still
|
|
245
257
|
works under `auto` and is idempotent: with nothing staged it prints
|
|
246
258
|
`nothing staged` and exits `0`.
|
|
@@ -264,7 +276,7 @@ install|check|doctor` follow the section; `install` prunes projected files the b
|
|
|
264
276
|
--providers=<list>` rewrites it in place. Without the section they use the
|
|
265
277
|
install lock's providers, then the detected ones; nothing undetected is ever
|
|
266
278
|
added. A present section that is not this shape, or names another harness,
|
|
267
|
-
fails those commands (exit `1`), and `canon init --check
|
|
279
|
+
fails those commands (exit `1`), and `canon init --check` reports
|
|
268
280
|
`[PASS] skills (providers: …)`, `[not configured] skills (…)`, or
|
|
269
281
|
`[FAIL] skills: …`.
|
|
270
282
|
|
|
@@ -272,29 +284,35 @@ fails those commands (exit `1`), and `canon init --check-config` reports
|
|
|
272
284
|
|
|
273
285
|
`canon inventory sync` materializes one `Scenario` record per
|
|
274
286
|
`(project_id, scenario_id)` under `.canon/ledger/kind=scenario/`. The
|
|
275
|
-
index is derived — a pure function of the `.feature` files
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
`canon
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
+
index is derived — a pure function of the `.feature` files. The index is
|
|
288
|
+
stale when a `.feature` file holds a scenario with no live index record,
|
|
289
|
+
or one whose recorded source digest differs from the file's current bytes,
|
|
290
|
+
or when the index holds a scenario of a spec root that no `.feature` file
|
|
291
|
+
of it declares any more.
|
|
292
|
+
|
|
293
|
+
The commands that write records (`canon subject move`, `canon review
|
|
294
|
+
scenario`, `canon evidence add` and `canon artifacts store`) rebuild a stale index on disk first: they
|
|
295
|
+
run `canon inventory sync`'s code on the changed files (validation still
|
|
296
|
+
covers the whole root) and print one stderr line:
|
|
297
|
+
|
|
298
|
+
```stderr
|
|
299
|
+
canon artifacts store: refreshed the scenario index from 1 changed feature file(s) (.canon/specs/kind=feature/area=cart/add.feature): 1 record(s) written
|
|
287
300
|
```
|
|
288
301
|
|
|
289
|
-
|
|
302
|
+
The commands that only read (`canon gate check`, `canon status`) write
|
|
303
|
+
nothing: they grade a stale index as the refresh would leave it, built in
|
|
304
|
+
memory, and print no refresh line. `canon query --kind scenario` and the
|
|
305
|
+
report panels read the index on disk as it is.
|
|
306
|
+
|
|
307
|
+
A deleted scenario is not erased: `canon inventory sync` — and a writer's
|
|
290
308
|
refresh, identically — appends a tombstone, a new generation of its
|
|
291
309
|
record with `removed: true`. The gate, `canon status`, `canon query` and
|
|
292
310
|
the report panels then treat it as absent; re-adding the scenario writes
|
|
293
311
|
a live generation that supersedes the tombstone. A root that fails to
|
|
294
312
|
sync writes no tombstone either.
|
|
295
313
|
|
|
296
|
-
```
|
|
297
|
-
canon
|
|
314
|
+
```stderr
|
|
315
|
+
canon artifacts store: refreshed the scenario index from 1 scenario(s) no longer in any feature file (cart.pay.01): 1 record(s) written
|
|
298
316
|
```
|
|
299
317
|
|
|
300
318
|
`canon inventory sync` and every refresh hold an OS file lock on
|
|
@@ -303,17 +321,16 @@ index one change twice; a refresh that waited checks staleness again and
|
|
|
303
321
|
is silent if another run already did the work. The lock is released when
|
|
304
322
|
its holder exits, however it exits, so it never goes stale; a writer
|
|
305
323
|
gives up after 30 s with a message naming the file (`canon inventory
|
|
306
|
-
sync` exits `2`; a
|
|
324
|
+
sync` exits `2`; a writer's refresh is skipped and the command still runs).
|
|
307
325
|
|
|
308
326
|
A fresh index prints nothing. A root that fails to sync (format
|
|
309
327
|
violations, a duplicate id) is named and left as it was, and the command
|
|
310
328
|
still runs; `canon gate check` then fails with `uncovered-cell <root>`,
|
|
311
329
|
the `verifying → shipped` guard refuses, and `canon status` lists only
|
|
312
|
-
`canon inventory sync
|
|
313
|
-
keep only this line:
|
|
330
|
+
`canon inventory sync`:
|
|
314
331
|
|
|
315
|
-
```
|
|
316
|
-
canon
|
|
332
|
+
```stderr
|
|
333
|
+
canon artifacts store: found the scenario index stale for 1 changed feature file(s) (…): 0 record(s) written; NOT refreshed: root `root` (2 format violation(s), 0 sync error(s)) — `canon inventory sync` lists them
|
|
317
334
|
```
|
|
318
335
|
|
|
319
336
|
Nothing is written in a directory without `canon.yaml`. `canon inventory
|
|
@@ -323,7 +340,7 @@ tag diagnostics.
|
|
|
323
340
|
## The artifact store lock
|
|
324
341
|
|
|
325
342
|
Every write to the evidence artifact store (`.canon/artifacts/sha256/`:
|
|
326
|
-
`canon evidence add`, `canon review
|
|
343
|
+
`canon evidence add`, `canon review scenario`, `canon artifacts store`) holds an
|
|
327
344
|
OS file lock on `.canon/artifact-store.lock` from its "already stored?"
|
|
328
345
|
check through its last rename, so a write that fails and rolls back never
|
|
329
346
|
removes a blob another writer published or counted as stored. A rollback
|
|
@@ -350,9 +367,23 @@ comment, only the missing ones):
|
|
|
350
367
|
- `.canon/dashboard-snapshot/` — the snapshot `canon dashboard`
|
|
351
368
|
regenerates on every run.
|
|
352
369
|
- `.canon/learn/` and `.canon/r2/` — local learn scratch and the local
|
|
353
|
-
object-store stand-in `canon report` writes.
|
|
370
|
+
object-store stand-in `canon report build` writes.
|
|
354
371
|
|
|
355
372
|
A rerun on a repo that already has `canon.yaml` only refreshes
|
|
356
373
|
`AGENTS.md`; `canon migrate` adds the lines an existing `.gitignore`
|
|
357
|
-
lacks, and `canon skills doctor` and `canon init --check
|
|
374
|
+
lacks, and `canon skills doctor` and `canon init --check` name a
|
|
358
375
|
missing one.
|
|
376
|
+
|
|
377
|
+
## Upgrading a 0.27 repository
|
|
378
|
+
|
|
379
|
+
`canon status`, `canon gate check` and `canon context` warn on a repo that
|
|
380
|
+
still holds 0.27 canon state and put `canon migrate --json` first in
|
|
381
|
+
`meta.next`. `canon migrate` is destructive-class: the bare run is a
|
|
382
|
+
preview (a report with `planDigest` and `effects[]`, exit 0, nothing
|
|
383
|
+
written); `canon migrate --commit --plan-digest <digest from the preview>`
|
|
384
|
+
acts, and only when the plan recomputed now has the same digest. Afterwards
|
|
385
|
+
run `canon skills install`, which writes the stub guide; the guide itself is
|
|
386
|
+
read with `canon skills show canon`.
|
|
387
|
+
|
|
388
|
+
**Done when:** `canon status` no longer warns about 0.27 state and
|
|
389
|
+
`canon migrate --json` is no longer the first step in `meta.next`.
|