@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.
Files changed (133) hide show
  1. package/dist/skills/SKILL.src.md +245 -89
  2. package/dist/skills/reference/brief-align.md +4 -2
  3. package/dist/skills/reference/brief-clarify.md +7 -5
  4. package/dist/skills/reference/brief-harden.md +4 -2
  5. package/dist/skills/reference/brief-polish.md +7 -5
  6. package/dist/skills/reference/brief-shape.md +4 -2
  7. package/dist/skills/reference/canon-artifact-ingest.md +11 -7
  8. package/dist/skills/reference/canon-authoring.md +16 -2
  9. package/dist/skills/reference/canon-context.md +21 -11
  10. package/dist/skills/reference/canon-fmt.md +10 -2
  11. package/dist/skills/reference/canon-gate.md +119 -83
  12. package/dist/skills/reference/canon-inventory.md +34 -22
  13. package/dist/skills/reference/canon-learn.md +23 -19
  14. package/dist/skills/reference/canon-plan-import.md +10 -7
  15. package/dist/skills/reference/canon-plugins.md +15 -8
  16. package/dist/skills/reference/canon-policy.md +20 -16
  17. package/dist/skills/reference/canon-report-dashboard.md +30 -19
  18. package/dist/skills/reference/canon-retrieve.md +13 -10
  19. package/dist/skills/reference/canon-review.md +96 -68
  20. package/dist/skills/reference/canon-session-ingest.md +7 -3
  21. package/dist/skills/reference/canon-storage.md +82 -51
  22. package/dist/skills/reference/canon-subject.md +123 -84
  23. package/dist/skills/reference/canon-vocab.md +1 -1
  24. package/dist/skills/reference/role-implementer.md +295 -64
  25. package/dist/skills/reference/role-orchestrator.md +547 -55
  26. package/dist/skills/reference/role-planner.md +189 -32
  27. package/dist/skills/reference/role-reviewer.md +257 -58
  28. package/dist/skills/scripts/canon-retrieve-pre-dispatch.sh +10 -5
  29. package/man/canon-adapter-authorize.1 +44 -0
  30. package/man/canon-adapter-validate.1 +44 -0
  31. package/man/canon-adapter.1 +46 -0
  32. package/man/canon-artifacts-move.1 +63 -0
  33. package/man/canon-artifacts-store.1 +54 -0
  34. package/man/canon-artifacts-verify.1 +48 -0
  35. package/man/canon-artifacts.1 +45 -0
  36. package/man/canon-brief-approve.1 +62 -0
  37. package/man/canon-brief-check.1 +44 -0
  38. package/man/canon-brief-show.1 +50 -0
  39. package/man/canon-brief.1 +63 -0
  40. package/man/canon-change-new.1 +66 -0
  41. package/man/canon-change.1 +42 -0
  42. package/man/canon-completion.1 +60 -0
  43. package/man/canon-context-pack-add.1 +47 -0
  44. package/man/canon-context-pack-show.1 +44 -0
  45. package/man/canon-context-pack-verify.1 +44 -0
  46. package/man/canon-context-pack.1 +50 -0
  47. package/man/canon-context.1 +44 -0
  48. package/man/canon-dashboard.1 +50 -0
  49. package/man/canon-demo-init.1 +44 -0
  50. package/man/canon-demo-review.1 +44 -0
  51. package/man/canon-demo.1 +47 -0
  52. package/man/canon-dispatch-begin.1 +80 -0
  53. package/man/canon-dispatch-diff.1 +41 -0
  54. package/man/canon-dispatch-end.1 +60 -0
  55. package/man/canon-dispatch.1 +45 -0
  56. package/man/canon-divergence-accept.1 +68 -0
  57. package/man/canon-divergence-add.1 +97 -0
  58. package/man/canon-divergence-defer.1 +71 -0
  59. package/man/canon-divergence-list.1 +56 -0
  60. package/man/canon-divergence-resolve.1 +68 -0
  61. package/man/canon-divergence.1 +51 -0
  62. package/man/canon-evidence-add.1 +168 -0
  63. package/man/canon-evidence-approval-payload.1 +65 -0
  64. package/man/canon-evidence-audit.1 +121 -0
  65. package/man/canon-evidence.1 +57 -0
  66. package/man/canon-export.1 +108 -0
  67. package/man/canon-feature-new.1 +62 -0
  68. package/man/canon-feature.1 +39 -0
  69. package/man/canon-finding-add.1 +196 -0
  70. package/man/canon-finding-close.1 +117 -0
  71. package/man/canon-finding-list.1 +59 -0
  72. package/man/canon-finding.1 +67 -0
  73. package/man/canon-format.1 +49 -0
  74. package/man/canon-gate-check.1 +44 -0
  75. package/man/canon-gate-install-hooks.1 +59 -0
  76. package/man/canon-gate-promote.1 +62 -0
  77. package/man/canon-gate.1 +50 -0
  78. package/man/canon-ingest-plans.1 +53 -0
  79. package/man/canon-ingest-records.1 +56 -0
  80. package/man/canon-ingest-sessions.1 +62 -0
  81. package/man/canon-ingest.1 +50 -0
  82. package/man/canon-init.1 +98 -0
  83. package/man/canon-inventory-sync.1 +50 -0
  84. package/man/canon-inventory.1 +39 -0
  85. package/man/canon-ledger-compact.1 +50 -0
  86. package/man/canon-ledger.1 +54 -0
  87. package/man/canon-migrate.1 +89 -0
  88. package/man/canon-plugin-sync.1 +53 -0
  89. package/man/canon-plugin.1 +39 -0
  90. package/man/canon-policy-approve.1 +50 -0
  91. package/man/canon-policy-show.1 +41 -0
  92. package/man/canon-policy.1 +52 -0
  93. package/man/canon-prompt-add.1 +47 -0
  94. package/man/canon-prompt-show.1 +41 -0
  95. package/man/canon-prompt.1 +43 -0
  96. package/man/canon-purge.1 +70 -0
  97. package/man/canon-query.1 +111 -0
  98. package/man/canon-regime-show.1 +50 -0
  99. package/man/canon-regime.1 +39 -0
  100. package/man/canon-report-build.1 +44 -0
  101. package/man/canon-report-check.1 +41 -0
  102. package/man/canon-report-snapshot.1 +47 -0
  103. package/man/canon-report.1 +45 -0
  104. package/man/canon-retrieve.1 +56 -0
  105. package/man/canon-review-change.1 +98 -0
  106. package/man/canon-review-scenario.1 +98 -0
  107. package/man/canon-review.1 +42 -0
  108. package/man/canon-scenario-new.1 +80 -0
  109. package/man/canon-scenario.1 +39 -0
  110. package/man/canon-schema.1 +63 -0
  111. package/man/canon-selftest.1 +69 -0
  112. package/man/canon-skills-check.1 +47 -0
  113. package/man/canon-skills-doctor.1 +47 -0
  114. package/man/canon-skills-install.1 +53 -0
  115. package/man/canon-skills-show.1 +104 -0
  116. package/man/canon-skills.1 +48 -0
  117. package/man/canon-status.1 +51 -0
  118. package/man/canon-strategy-approval-payload.1 +53 -0
  119. package/man/canon-strategy-promote.1 +59 -0
  120. package/man/canon-strategy-rollback.1 +62 -0
  121. package/man/canon-strategy.1 +45 -0
  122. package/man/canon-subject-adopt.1 +53 -0
  123. package/man/canon-subject-move.1 +80 -0
  124. package/man/canon-subject-new.1 +65 -0
  125. package/man/canon-subject-show.1 +44 -0
  126. package/man/canon-subject-unadopt.1 +63 -0
  127. package/man/canon-subject.1 +51 -0
  128. package/man/canon-task-done.1 +47 -0
  129. package/man/canon-task.1 +42 -0
  130. package/man/canon-tier-age.1 +50 -0
  131. package/man/canon-tier.1 +39 -0
  132. package/man/canon.1 +169 -0
  133. 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 take `--canon-yaml <path>` (default `canon.yaml` in the current
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 --dry-run # report; writes nothing
120
- canon ledger compact # pre-0.23 ledger or interrupted move; idempotent; `canon migrate` runs it
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 add` and `evidence vault`
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 migrate --to <tier> [--dry-run]`
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
- report`; kinds routed to `canon init`'s default sqlite `hot` rung do.
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> (--plan | --confirm <planDigest>) [--repo <dir>] [--json]`
166
- is the canonical data-lifecycle boundary: `--plan` prints the removal set and
167
- its `planDigest` and deletes nothing; `--confirm <planDigest>` deletes only if
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), and a bare `purge` is refused (`PURGE_PLAN_REQUIRED`). The only purgeable kinds are
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 `--confirm`), and an export's page state (`total`, `returned`,
185
- `nextCursor`) sits in `meta`. `export --json --out <file>` writes the manifest to the
186
- file and answers with `data: { out, kind, recordCount }`.
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
- [--out <file>] [--json] [--limit <n> | --all] [--cursor <c>]` emits a versioned manifest containing source scope,
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` or `--canon-yaml`), never in
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 divergence promote` commits only
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-config` reports `[PASS] write (promote: auto)`, `[not configured]
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-config` reports
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 — so the
276
- commands that read it rebuild it first: `canon gate check`, `canon
277
- status`, `canon subject status`, `canon review add` and `canon evidence
278
- add`. The index is stale when a `.feature` file holds a scenario with no
279
- live index record, or one whose recorded source digest differs from the
280
- file's current bytes, or when the index holds a scenario of a spec root
281
- that no `.feature` file of it declares any more. The reader then runs
282
- `canon inventory sync`'s code on the changed files (validation still
283
- covers the whole root) and prints one stderr line:
284
-
285
- ```
286
- canon status: refreshed the scenario index from 1 changed feature file(s) (.canon/specs/kind=feature/area=cart/add.feature): 1 record(s) written
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
- A deleted scenario is not erased: `canon inventory sync` — and a reader's
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 status: refreshed the scenario index from 1 scenario(s) no longer in any feature file (cart.pay.01): 1 record(s) written
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 reader skips the refresh and still runs).
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`, while the reporting readers (`query`, `context`)
313
- keep only this line:
330
+ `canon inventory sync`:
314
331
 
315
- ```
316
- canon gate check: 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
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 add`, `canon evidence vault`) holds an
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-config` name a
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`.