@journeykit/canon 0.38.0 → 0.39.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 (118) hide show
  1. package/dist/skills/SKILL.src.md +8 -3
  2. package/dist/skills/reference/canon-artifact-ingest.md +0 -2
  3. package/dist/skills/reference/canon-gate.md +27 -2
  4. package/dist/skills/reference/canon-report-dashboard.md +27 -36
  5. package/dist/skills/reference/canon-storage.md +25 -1
  6. package/dist/skills/reference/role-implementer.md +2 -2
  7. package/dist/skills/reference/role-orchestrator.md +10 -15
  8. package/dist/skills/reference/role-planner.md +2 -2
  9. package/dist/skills/reference/role-reviewer.md +2 -2
  10. package/man/canon-adapter-authorize.1 +2 -2
  11. package/man/canon-adapter-validate.1 +2 -2
  12. package/man/canon-adapter.1 +2 -2
  13. package/man/canon-artifacts-move.1 +2 -2
  14. package/man/canon-artifacts-prune.1 +4 -2
  15. package/man/canon-artifacts-store.1 +2 -2
  16. package/man/canon-artifacts-verify.1 +4 -2
  17. package/man/canon-artifacts.1 +2 -2
  18. package/man/canon-brief-approve.1 +2 -2
  19. package/man/canon-brief-check.1 +2 -2
  20. package/man/canon-brief-show.1 +2 -2
  21. package/man/canon-brief.1 +2 -2
  22. package/man/canon-change-new.1 +2 -2
  23. package/man/canon-change.1 +2 -2
  24. package/man/canon-completion.1 +2 -2
  25. package/man/canon-context-pack-add.1 +2 -2
  26. package/man/canon-context-pack-show.1 +2 -2
  27. package/man/canon-context-pack-verify.1 +2 -2
  28. package/man/canon-context-pack.1 +2 -2
  29. package/man/canon-context.1 +2 -2
  30. package/man/canon-dashboard.1 +2 -2
  31. package/man/canon-demo-init.1 +2 -2
  32. package/man/canon-demo-review.1 +2 -2
  33. package/man/canon-demo.1 +2 -2
  34. package/man/canon-dispatch-begin.1 +2 -2
  35. package/man/canon-dispatch-diff.1 +2 -2
  36. package/man/canon-dispatch-end.1 +2 -2
  37. package/man/canon-dispatch.1 +2 -2
  38. package/man/canon-divergence-accept.1 +2 -2
  39. package/man/canon-divergence-add.1 +2 -2
  40. package/man/canon-divergence-defer.1 +2 -2
  41. package/man/canon-divergence-list.1 +2 -2
  42. package/man/canon-divergence-resolve.1 +2 -2
  43. package/man/canon-divergence.1 +2 -2
  44. package/man/canon-evidence-add.1 +3 -3
  45. package/man/canon-evidence-approval-payload.1 +2 -2
  46. package/man/canon-evidence-audit.1 +2 -2
  47. package/man/canon-evidence.1 +2 -2
  48. package/man/canon-export.1 +2 -6
  49. package/man/canon-feature-new.1 +2 -2
  50. package/man/canon-feature.1 +2 -2
  51. package/man/canon-finding-add.1 +2 -2
  52. package/man/canon-finding-close.1 +2 -2
  53. package/man/canon-finding-list.1 +2 -2
  54. package/man/canon-finding.1 +2 -2
  55. package/man/canon-format.1 +2 -2
  56. package/man/canon-gate-check.1 +2 -2
  57. package/man/canon-gate-install-hooks.1 +2 -2
  58. package/man/canon-gate-promote.1 +2 -2
  59. package/man/canon-gate.1 +2 -2
  60. package/man/canon-ingest-plans.1 +2 -2
  61. package/man/canon-ingest-records.1 +2 -2
  62. package/man/canon-ingest.1 +4 -8
  63. package/man/canon-init.1 +2 -2
  64. package/man/canon-inventory-sync.1 +2 -2
  65. package/man/canon-inventory.1 +2 -2
  66. package/man/canon-ledger-compact.1 +2 -2
  67. package/man/canon-ledger.1 +2 -2
  68. package/man/canon-migrate.1 +2 -2
  69. package/man/canon-plugin-sync.1 +2 -2
  70. package/man/canon-plugin.1 +2 -2
  71. package/man/canon-policy-approve.1 +2 -2
  72. package/man/canon-policy-show.1 +2 -2
  73. package/man/canon-policy.1 +2 -2
  74. package/man/canon-prompt-add.1 +2 -2
  75. package/man/canon-prompt-show.1 +2 -2
  76. package/man/canon-prompt.1 +2 -2
  77. package/man/canon-purge.1 +8 -8
  78. package/man/canon-query.1 +2 -6
  79. package/man/canon-regime-show.1 +2 -2
  80. package/man/canon-regime.1 +2 -2
  81. package/man/canon-report-build.1 +2 -2
  82. package/man/canon-report-check.1 +2 -2
  83. package/man/canon-report-snapshot.1 +2 -2
  84. package/man/canon-report.1 +2 -2
  85. package/man/canon-retrieve.1 +2 -2
  86. package/man/canon-review-change.1 +2 -2
  87. package/man/canon-review-scenario.1 +2 -2
  88. package/man/canon-review.1 +2 -2
  89. package/man/canon-scenario-new.1 +2 -2
  90. package/man/canon-scenario.1 +2 -2
  91. package/man/canon-schema.1 +2 -2
  92. package/man/canon-search.1 +2 -6
  93. package/man/canon-selftest.1 +2 -4
  94. package/man/canon-skills-check.1 +2 -2
  95. package/man/canon-skills-doctor.1 +2 -2
  96. package/man/canon-skills-install.1 +2 -2
  97. package/man/canon-skills-show.1 +2 -4
  98. package/man/canon-skills.1 +2 -2
  99. package/man/canon-status.1 +2 -2
  100. package/man/canon-strategy-approval-payload.1 +2 -2
  101. package/man/canon-strategy-promote.1 +2 -2
  102. package/man/canon-strategy-rollback.1 +2 -2
  103. package/man/canon-strategy.1 +2 -2
  104. package/man/canon-subject-adopt.1 +2 -2
  105. package/man/canon-subject-move.1 +2 -2
  106. package/man/canon-subject-new.1 +2 -2
  107. package/man/canon-subject-show.1 +2 -2
  108. package/man/canon-subject-unadopt.1 +2 -2
  109. package/man/canon-subject.1 +2 -2
  110. package/man/canon-task-done.1 +2 -2
  111. package/man/canon-task.1 +2 -2
  112. package/man/canon-tier-age.1 +2 -2
  113. package/man/canon-tier.1 +2 -2
  114. package/man/canon-trace.1 +2 -2
  115. package/man/canon.1 +4 -4
  116. package/package.json +4 -4
  117. package/dist/skills/reference/canon-session-ingest.md +0 -224
  118. package/man/canon-ingest-sessions.1 +0 -62
@@ -168,7 +168,13 @@ binds it, and, with `--keep-days N`, while any evidence or review of the last
168
168
  `N` days binds it; the bare run previews the blobs it deletes and why the rest
169
169
  stay, and `--commit --plan-digest` deletes. A deleted local blob stays in git
170
170
  history (shrinking that history is the repo owner's call, not the command's); a
171
- deleted object of an object-store tier is gone for good.
171
+ deleted object of an object-store tier is gone for good. The preview and the
172
+ commit also cover the stale temp files a killed blob write leaves in
173
+ `.canon/artifacts/sha256` (`.tmp-<sha256>-<pid>-<nanos>`, a regular file
174
+ modified over five minutes ago): the plan lists them in `data.staleTemps`, and
175
+ `artifacts verify` only counts them (it deletes nothing and its exit does not
176
+ change). A temp file is no finished blob, so deleting it changes no record; one
177
+ that git already tracks must be taken out of the commit.
172
178
 
173
179
  ### Search and trace
174
180
 
@@ -338,7 +344,7 @@ preview helps elsewhere (`init`, `skills install`, `export`, `inventory sync`,
338
344
  `subject adopt`, …) `--dry-run` validates fully and writes nothing.
339
345
 
340
346
  ```bash
341
- canon purge --kind session --before 2026-01-01
347
+ canon purge --kind run --before 2026-01-01
342
348
  ```
343
349
 
344
350
  ## Upgrading a repo from 0.27
@@ -441,7 +447,6 @@ current step needs.
441
447
  | `canon-gate` | Evidence, gates, task checkboxes, hooks. |
442
448
  | `canon-review` | Findings and reviews. |
443
449
  | `canon-artifact-ingest` | `canon ingest records`: artifacts into verdict trajectories. |
444
- | `canon-session-ingest` | `canon ingest sessions`: agent transcripts into session records. |
445
450
  | `canon-plan-import` | `canon ingest plans`: plan state into change and task records. |
446
451
  | `canon-storage` | Storage rungs, tiers, retention, export, purge. |
447
452
  | `canon-policy` | The policy and the CEL expressions behind it. |
@@ -71,8 +71,6 @@ promotion/demotion.
71
71
 
72
72
  ## What this skill does NOT cover
73
73
 
74
- - Session/cost ingestion (`canon ingest sessions`) — a different
75
- pipeline; see the `canon-session-ingest` skill.
76
74
  - Strategy promotion/demotion mechanics — see the `canon-learn` skill;
77
75
  this skill only produces the verdict evidence promotion reads.
78
76
  - The `regime_key` grammar itself — see `canon-retrieve`, which derives
@@ -24,7 +24,7 @@ Every violation carries one of these stable, grep-able strings:
24
24
  | `uncovered-cell` | Either a policy-required evidence cell (role × artifact) with no matching record, or — with `spec_coverage` enabled — a spec scenario that is unimplemented or mismatched, or a feature surface missing a `require_cases` case. The detail string distinguishes them. Coverage means "a test exists", not "a test passed": even a `Divergent` verdict satisfies the role-cell form. At `verifying → shipped`, a `Divergent` latest verdict is `uncovered-cell` unless a reviewer accepted it (see Accepted divergence below), and a chore's approval, like a blocker closed `fixed`, needs every evidenced scenario evidenced again afterwards (see Re-verification below). |
25
25
  | `unreviewed-promotion` | An artifact tagged `reviewed` has no matching ledger review record — or, with `spec_coverage.require_review` set, an in-scope scenario has no qualifying `Review`: none at all, only self-reviews, only stale reviews (the spec or evidence it pinned changed since), or only `indeterminate`/`unavailable` ones. Also, subject `policy`: the policy changed since its approval or its approval is unreadable (fails closed; see `canon-policy`). See `canon-review`. |
26
26
  | `trust-below-required` | Achieved trust level is below `policy.yaml`'s `trust_required` for its class — RELEASE-scoped only (`canon gate check --release`); never fires on an ordinary run. |
27
- | `stale-evidence` | A passing record degraded to stale: its declared surface changed since its `evidence_sha`, or HEAD moved past `staleness.max_commits_behind`. Only degrades an already-green record. Also: a file bound to a latest evidence record whose bytes are gone — no intact blob in `.canon/artifacts/sha256/` and no working-tree copy with the recorded digest — or a file bound to an in-effect review with no intact blob (see Bound evidence stays provable below). |
27
+ | `stale-evidence` | A passing record degraded to stale: a path that changed since its `evidence_sha` matches its declared surface (`--surface-ref`, a path pattern read from the repository root; the detail names the declarations and paths that matched), or HEAD moved past `staleness.max_commits_behind`. Only degrades an already-green record. Also: a file bound to a latest evidence record whose bytes are gone — no intact blob in `.canon/artifacts/sha256/` and no working-tree copy with the recorded digest — or a file bound to an in-effect review with no intact blob (see Bound evidence stays provable below). |
28
28
  | `malformed-evidence` | A candidate record doesn't parse, is misfiled, or carries an unparseable interim tag. Malformed evidence is no evidence. |
29
29
  | `flagged` | The human-only `flagged` overlay is set — never green regardless of passing evidence. |
30
30
  | `unevidenced-flip` | `canon task done <task_id>` was asked to flip a checkbox with no matching, non-`Divergent` evidence record. |
@@ -628,7 +628,8 @@ downloads and re-hashes) and refuse, never pass, when it cannot be reached.
628
628
  store; it is the repo owner's decision. `canon artifacts prune` (a preview;
629
629
  `--commit --plan-digest` acts) deletes the blobs no record binds any more and
630
630
  leaves what `gate check` and `artifacts verify` read, so their answers do not
631
- change; it is the repo owner's decision too. See `canon-storage`.
631
+ change (it also deletes the stale `.tmp-` files a killed blob write left, which
632
+ `artifacts verify` counts without deleting); it is the repo owner's decision too. See `canon-storage`.
632
633
 
633
634
  `canon gate check` re-checks every file bound to a LATEST evidence record
634
635
  (the latest per task and per `(project_id, scenario_id)`):
@@ -698,6 +699,30 @@ binding. This is still attestation input, not proof of the changed paths;
698
699
  run/diff metadata is authoritative when available, and an unavailable
699
700
  binding is a gate violation rather than a clean result.
700
701
 
702
+ A `--surface-ref` that is not `effect:...` is a path pattern read from the
703
+ repository root with the glob of `code.exclude`: `*` and `?` do not cross
704
+ `/`, `**` does, a directory matches everything below it, and a trailing `/`
705
+ is dropped. `src/`, `src`, `src/**` and `src/*.rs` all go `stale-evidence`
706
+ when `src/a.rs` changes; for `src/x/b.rs` the first three do and `src/*.rs`
707
+ does not. A name with no `/` is the file at the root: `Cargo.toml` is
708
+ the root manifest, not every crate's. A value identical to a changed path
709
+ matches it, and `effect:` is never compared with paths. A value that
710
+ matches no file of the work tree is recorded all the same, with a
711
+ `SURFACE_REF_UNMATCHED` warning. The `paths` of a risk tier keep their
712
+ older reading (`*` crosses `/`) until the next release that breaks
713
+ compatibility.
714
+
715
+ When git cannot read the base commit of a passing cell, `canon gate check`
716
+ prints one `staleness_unresolvable` advisory and `canon status` one
717
+ `STALENESS_UNRESOLVABLE` warning, with the same sentence: how many
718
+ (subject, role) cells, how many for each reason (`base_missing`: the commit
719
+ is not in this repository, as in a shallow clone or after `git gc
720
+ --prune=now`; `base_not_ancestor`: it is not an ancestor of HEAD, as after
721
+ a squash merge; `git_unavailable`: git did not answer), the first three
722
+ subjects, and `git fetch --unshallow` in a shallow clone. Verdicts and the
723
+ exit status do not change: a `base_missing` or `git_unavailable` cell adds
724
+ nothing, a `base_not_ancestor` cell is judged from `<base>..HEAD`.
725
+
701
726
  Approval identity is separate from attestation text. An approval counts
702
727
  only when it carries a detached SSH signature (`ssh-keygen -Y sign -n
703
728
  canon-approval-v1` over `canon evidence approval-payload`'s bytes) that
@@ -1,9 +1,9 @@
1
1
  # canon-report-dashboard
2
2
 
3
- canon's single status surface: `canon report build` renders TEN panels to
4
- markdown, `canon report snapshot` exports the same ten marts to
3
+ canon's single status surface: `canon report build` renders NINE panels to
4
+ markdown, `canon report snapshot` exports the same nine marts to
5
5
  Parquet, and `canon dashboard` serves a small zero-network web app that
6
- renders SEVEN of them from such a snapshot. Neither surface computes an
6
+ renders SIX of them from such a snapshot. Neither surface computes an
7
7
  aggregate itself — both read canon's precomputed
8
8
  `crates/canon-store/sql/views.sql` marts, and each run reads the corpus
9
9
  ONCE (`crates/canon-report/src/query.rs`'s `PIN_CORPUS_SQL`), so no two
@@ -35,7 +35,7 @@ drift-checked.
35
35
 
36
36
  ## `canon report build [--repo <dir>]`
37
37
 
38
- Renders the current ten-panel report to `<repo>/.canon/REPORT.md`.
38
+ Renders the current nine-panel report to `<repo>/.canon/REPORT.md`.
39
39
  `--repo` resolves through the nearest-`canon.yaml`-ancestor walk every
40
40
  subcommand uses — omit it (or pass `.`) to run from any subdirectory.
41
41
 
@@ -82,7 +82,7 @@ and commit the result.
82
82
 
83
83
  ## `canon report snapshot <dir>`
84
84
 
85
- Exports all ten views to `<dir>/<table>.parquet` plus a
85
+ Exports all nine views to `<dir>/<table>.parquet` plus a
86
86
  `<dir>/manifest.json`. One explicit `COPY` per view — the exported
87
87
  columns are each view's own `SELECT` list, wider than the curated column
88
88
  subset the markdown tables render. `file` is always
@@ -98,7 +98,6 @@ existing consumer's order never moves:
98
98
  "source_digest": "...",
99
99
  "tables": [
100
100
  { "table": "mart_trust_matrix", "file": "mart_trust_matrix.parquet" },
101
- { "table": "mart_session_costs", "file": "mart_session_costs.parquet" },
102
101
  { "table": "mart_role_memory", "file": "mart_role_memory.parquet" },
103
102
  { "table": "mart_flywheel_funnel", "file": "mart_flywheel_funnel.parquet" },
104
103
  { "table": "mart_review_burndown", "file": "mart_review_burndown.parquet" },
@@ -174,7 +173,7 @@ human's explicit answer, with `--relayed-via`. The page lists the approvals an
174
173
  agent recorded for the human under "Approved through an agent" (`relayed` in
175
174
  `GET /api/briefs`), with the role, actor and tool of each.
176
175
 
177
- The dashboard renders SEVEN panels — trust matrix, session costs, role
176
+ The dashboard renders SIX panels — trust matrix, role
178
177
  memory, flywheel funnel, review burn-down, review rounds, review totals.
179
178
  **Scope status
180
179
  and subjects are exported to the snapshot but have no dashboard panel**;
@@ -186,7 +185,7 @@ The dashboard's freshness banner shows the snapshot's
186
185
  snapshot, not necessarily the live checkout" note — treat "matches
187
186
  `canon report`" as "matches the inputs that produced THIS snapshot".
188
187
 
189
- ## Reading the ten panels
188
+ ## Reading the nine panels
190
189
 
191
190
  In `canon report`'s own render order. Each panel names the view that
192
191
  computes it; nothing here is derived a second time.
@@ -202,17 +201,6 @@ computes it; nothing here is derived a second time.
202
201
  version; `green` and `who` are read off one whole winner row, so they can
203
202
  never come from two different attestations.
204
203
 
205
- - **Session costs** (`mart_session_costs`) — token/cost per
206
- `(session, client, role, workspace_label)`. Every `run`/`session`/
207
- `token_usage` record is folded to its latest version first, so
208
- a re-ingested corrected cost REPLACES the superseded figure instead of being summed with it.
209
- `workspace_label` is NOT a repo identity: it is the last non-empty path
210
- segment of the `token_usage` event's workspace key and nothing more, so it
211
- SPLITS one repo whose worktrees sit in differently-named directories and
212
- MERGES two different repos sharing a directory name. Two stronger fields
213
- exist and this mart reads neither — the event's own `workspace_key`, and
214
- `Session.project_key`, which `canon-cli` stamps to the main worktree's key.
215
-
216
204
  - **Role memory** (`mart_role_memory`) — per-`(role, regime_key)` strategy
217
205
  counts. `hit_rate` is NOT a retrieval hit rate: it is the fraction of that
218
206
  namespace's distilled strategies carrying no `demotion` flag, i.e.
@@ -355,25 +343,28 @@ computes it; nothing here is derived a second time.
355
343
  a row is one change's review history, and `findings` moves with how
356
344
  much reviewing happened rather than with the change.
357
345
 
358
- Two marts in `views.sql` are NOT report panels and are not exported by
359
- `--snapshot`: `mart_records_by_kind` and `mart_session_run_handoff`.
360
- Read them with DuckDB directly against `views.sql`.
346
+ One mart in `views.sql` is NOT a report panel and is not exported by
347
+ `--snapshot`: `mart_records_by_kind`. It counts records per stored kind, so
348
+ rows of the retired `session`/`event` kinds that remain in a store still show
349
+ there until `canon purge` deletes them. Read it with DuckDB directly against
350
+ `views.sql`.
361
351
 
362
352
  - **Run observability** (`mart_run_observability`) — one row per folded
363
- `run_id`, appended as the tenth report/snapshot table after the established
364
- nine tables. It reports lifecycle identifiers/status/timestamps, latency
365
- only when both timestamps exist, event and label counts, child-run count,
366
- guidance count, lineage provider/model, and token/cost source totals. These
367
- are bounded observations and proxies: event counts do not infer tool calls,
368
- retries, or human interventions, and no field claims guidance caused an
369
- outcome. `directive_event_count` and `guidance_count` are counts only;
370
- directive and guidance text is never emitted. `*_unknown` columns explicitly
371
- expose missing joins/coverage, including missing session/project/task/lineage,
372
- end timestamps, event times, costs, and guidance. Workspace absolute paths
373
- and verbatim directives/guidance are intentionally omitted. The adapter
374
- contract is strict read-only validation; this panel does not execute
375
- adapters or enforce provider sandbox capabilities. Privacy-safe omission of
376
- paths and directive/guidance text is part of the current semantics.
353
+ `run_id`, the ninth and last report/snapshot table after the established
354
+ eight tables. It reports lifecycle identifiers/status/timestamps, latency
355
+ only when both timestamps exist, child-run count, guidance count, and
356
+ lineage provider/model, all read from the `Run` record alone. These are
357
+ bounded observations and proxies: no field claims guidance caused an
358
+ outcome. `guidance_count` is a count only; guidance text is never emitted.
359
+ `*_unknown` columns explicitly expose missing values, including missing
360
+ session/project/task/parent-run lineage, end timestamps, provider/model and
361
+ guidance; a `Run` stored without `project_key` reads `project_key_unknown`.
362
+ There are no cost, token or event columns: canon has no cost or token
363
+ report and no replacement for it. Workspace absolute paths and verbatim
364
+ guidance are intentionally omitted. The adapter contract is strict
365
+ read-only validation; this panel does not execute adapters or enforce
366
+ provider sandbox capabilities. Privacy-safe omission of paths and guidance
367
+ text is part of the current semantics.
377
368
 
378
369
  ## What this skill does NOT cover
379
370
 
@@ -198,6 +198,26 @@ it is `ARTIFACTS_STORE_FAILED` (an object) or `WRITE_FAILED` (a local file); aft
198
198
  some, `ARTIFACTS_PRUNE_INCOMPLETE` names what was deleted, and a new preview
199
199
  lists what remains.
200
200
 
201
+ A blob write stages `.canon/artifacts/sha256/.tmp-<sha256>-<pid>-<nanos>` and
202
+ renames it when it is complete; a write killed in between (SIGKILL, a power
203
+ cut) leaves the file, and nothing else removes it. `canon artifacts prune`
204
+ counts the **stale** ones (a regular file of exactly that name shape, modified
205
+ more than five minutes ago; a younger file may be a live write, and a link, a
206
+ directory, a file stamped in the future or a name of another shape such as
207
+ `.tmp-notes` is never touched) in `data.staleTemps` (`files`, `bytes` and the
208
+ first names), apart from the blobs, and the commit deletes exactly the ones the
209
+ plan lists. They are part of the plan digest, so a temp file added or removed
210
+ since the preview is `PLAN_STALE`; the commit checks each again under the
211
+ store lock and skips one that changed; a repo with only temp files and no blob
212
+ to delete still gets the `--commit` command. `canon artifacts verify` takes no
213
+ lock and deletes nothing: it prints one line with the count and bytes and
214
+ `canon artifacts prune` when there are any, `data.staleTemps` always carries
215
+ `files` and `bytes` (`unreadable` instead, never a zero, when the store
216
+ directory cannot be read), and the exit follows the bound files alone. A temp
217
+ file is no finished blob, so deleting it changes no record. One that was
218
+ already committed is a tracked file: take it out of the commit (`git rm`, then
219
+ commit); the preview's `staleTemps.gitNote` says so.
220
+
201
221
  ## What `canon report build` does and doesn't read
202
222
 
203
223
  canon exposes layered `stg_`/`int_`/`mart_` query views; `canon report build`
@@ -223,7 +243,11 @@ is the canonical data-lifecycle boundary: the bare run previews: it prints the r
223
243
  its `planDigest` and deletes nothing; `--commit --plan-digest <planDigest>` deletes only if
224
244
  the plan recomputed now has the same digest (`PLAN_STALE`, exit 2, when the
225
245
  data moved). The only purgeable kinds are
226
- `session`, `run`, `event`, and `trajectory`; the cutoff applies to every
246
+ `run` and `trajectory`, plus the retired `session` and `event` (kept for this
247
+ release only so stored rows can be deleted — delete them now, after the next
248
+ release only direct database access remains; they read no routing, so they
249
+ find rows in every configured tier even after `canon migrate` removes the
250
+ `routing:`/`aging:` keys); the cutoff applies to every
227
251
  routed rung and every configured aging destination, including retained
228
252
  historical versions. For `trajectory`, the command also purges the
229
253
  operator-local Parquet learn store under `learn.root` in `canon.yaml`;
@@ -156,7 +156,7 @@ canon inventory sync --json
156
156
  ```
157
157
  ```text
158
158
  # Read stored records across every storage tier
159
- usage: 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>]
159
+ usage: canon query --kind <change|task|scenario|run|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>]
160
160
  ```
161
161
  ```bash
162
162
  canon query --kind evidence --json
@@ -184,7 +184,7 @@ canon schema evidence add --json
184
184
  ```
185
185
  ```text
186
186
  # Search records, brief sections and scenario text, with each hit's neighbors in the record graph
187
- usage: canon search <TEXT> [--kind <change|task|scenario|session|run|event|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding|brief>]* [--expand <N>] [--limit <N>]
187
+ usage: canon search <TEXT> [--kind <change|task|scenario|run|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding|brief>]* [--expand <N>] [--limit <N>]
188
188
  ```
189
189
  ```bash
190
190
  canon search timeout --kind finding --json
@@ -158,7 +158,7 @@ canon evidence approval-payload --scenario auth.login.01 --project root --approv
158
158
  ```
159
159
  ```text
160
160
  # Export a redacted retention manifest without deleting records
161
- usage: canon export --kind <change|task|scenario|session|run|event|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding> [--before <TIMESTAMP>] [--after <TIMESTAMP>] [--output <FILE>] [--include-sensitive] [--limit <N> | --all] [--cursor <CURSOR>] [--fields <FIELDS>] [--dry-run] [--input]
161
+ usage: canon export --kind <change|task|scenario|run|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding> [--before <TIMESTAMP>] [--after <TIMESTAMP>] [--output <FILE>] [--include-sensitive] [--limit <N> | --all] [--cursor <CURSOR>] [--fields <FIELDS>] [--dry-run] [--input]
162
162
  ```
163
163
  ```bash
164
164
  canon export --kind evidence --output evidence.json --json
@@ -206,13 +206,6 @@ usage: canon ingest records [--watch] [--interval-secs <N>] [--dry-run] [--run <
206
206
  canon ingest records --json
207
207
  ```
208
208
  ```text
209
- # Import agent CLI session transcripts (omp/pi, Claude Code, Codex, Hermes)
210
- usage: canon ingest sessions [--watch] [--interval-secs <N>] [--home <DIR>] [--full] [--all-workspaces] [--dry-run] [--input]
211
- ```
212
- ```bash
213
- canon ingest sessions --json
214
- ```
215
- ```text
216
209
  # Set up canon in a repo (canon.yaml, a starter policy, the AGENTS.md block, a plans home)
217
210
  usage: canon init [--check] [--no-agents-md | --check] [--policy <light|standard|strict> | --check | --no-policy] [--harness <claude|codex|omp|pi> | --check | --no-harness]* [--language <TAG> | --check] [--dry-run | --check] [--input]
218
211
  ```
@@ -272,15 +265,15 @@ canon prompt show reviewer@v1 --json
272
265
  ```
273
266
  ```text
274
267
  # Remove allowlisted records older than a cutoff
275
- usage: canon purge --kind <session|run|event|trajectory> --before <TIMESTAMP> [--commit --plan-digest <PLAN_DIGEST>] [--input]
268
+ usage: canon purge --kind <run|trajectory|session|event> --before <TIMESTAMP> [--commit --plan-digest <PLAN_DIGEST>] [--input]
276
269
  # a bare run previews and prints planDigest; `--commit --plan-digest <PLAN_DIGEST>` with that digest acts
277
270
  ```
278
271
  ```bash
279
- canon purge --kind session --before 2020-01-01T00:00:00Z --json
272
+ canon purge --kind run --before 2020-01-01T00:00:00Z --json
280
273
  ```
281
274
  ```text
282
275
  # Read stored records across every storage tier
283
- usage: 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>]
276
+ usage: canon query --kind <change|task|scenario|run|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>]
284
277
  ```
285
278
  ```bash
286
279
  canon query --kind evidence --json
@@ -329,14 +322,14 @@ canon schema evidence add --json
329
322
  ```
330
323
  ```text
331
324
  # Search records, brief sections and scenario text, with each hit's neighbors in the record graph
332
- usage: canon search <TEXT> [--kind <change|task|scenario|session|run|event|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding|brief>]* [--expand <N>] [--limit <N>]
325
+ usage: canon search <TEXT> [--kind <change|task|scenario|run|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding|brief>]* [--expand <N>] [--limit <N>]
333
326
  ```
334
327
  ```bash
335
328
  canon search timeout --kind finding --json
336
329
  ```
337
330
  ```text
338
331
  # Run canon's built-in fixture self-tests
339
- usage: canon selftest [--suite <trust-spine-gate|tiered-storage|typed-authoring-vocabulary|policy-expressions|format-authority|session-ingest|canon-context|artifact-ingest|spec-ledger-selftest|plugin-overlays|plan-import>]
332
+ usage: canon selftest [--suite <trust-spine-gate|tiered-storage|typed-authoring-vocabulary|policy-expressions|format-authority|canon-context|artifact-ingest|spec-ledger-selftest|plugin-overlays|plan-import>]
340
333
  ```
341
334
  ```bash
342
335
  canon selftest --suite trust-spine-gate --json
@@ -650,8 +643,10 @@ canon ledger compact
650
643
 
651
644
  `canon artifacts move --tier <tier>` moves the local artifact store to an
652
645
  object store and removes the local blobs, `canon artifacts prune` deletes the
653
- blobs no record binds any more (a deleted local blob stays in git history; a
654
- deleted object of a tier is gone for good), and `purge` deletes records. They
646
+ blobs no record binds any more and the stale `.tmp-` files a killed write left
647
+ in the store (a deleted local blob stays in git history; a deleted object of a
648
+ tier is gone for good; `canon artifacts verify` only counts the temp files), and
649
+ `purge` deletes records. They
655
650
  are the repo owner's decisions, not steps of the loop: run the preview, give
656
651
  the human the effects, and run the commit only on their answer. If the repo is
657
652
  large, the store is slow or the human has not asked for it, do not run it.
@@ -95,7 +95,7 @@ canon gate check --json
95
95
  ```
96
96
  ```text
97
97
  # Read stored records across every storage tier
98
- usage: 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>]
98
+ usage: canon query --kind <change|task|scenario|run|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>]
99
99
  ```
100
100
  ```bash
101
101
  canon query --kind evidence --json
@@ -123,7 +123,7 @@ canon schema evidence add --json
123
123
  ```
124
124
  ```text
125
125
  # Search records, brief sections and scenario text, with each hit's neighbors in the record graph
126
- usage: canon search <TEXT> [--kind <change|task|scenario|session|run|event|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding|brief>]* [--expand <N>] [--limit <N>]
126
+ usage: canon search <TEXT> [--kind <change|task|scenario|run|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding|brief>]* [--expand <N>] [--limit <N>]
127
127
  ```
128
128
  ```bash
129
129
  canon search timeout --kind finding --json
@@ -115,7 +115,7 @@ canon gate check --json
115
115
  ```
116
116
  ```text
117
117
  # Read stored records across every storage tier
118
- usage: 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
+ usage: canon query --kind <change|task|scenario|run|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>]
119
119
  ```
120
120
  ```bash
121
121
  canon query --kind evidence --json
@@ -150,7 +150,7 @@ canon schema evidence add --json
150
150
  ```
151
151
  ```text
152
152
  # Search records, brief sections and scenario text, with each hit's neighbors in the record graph
153
- usage: canon search <TEXT> [--kind <change|task|scenario|session|run|event|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding|brief>]* [--expand <N>] [--limit <N>]
153
+ usage: canon search <TEXT> [--kind <change|task|scenario|run|handoff|review|divergence|trajectory|strategy_item|evidence|subject|finding|brief>]* [--expand <N>] [--limit <N>]
154
154
  ```
155
155
  ```bash
156
156
  canon search timeout --kind finding --json
@@ -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.38.0"
3
+ .TH canon-adapter-authorize 1 "authorize 0.39.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.38.0
44
+ v0.39.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.38.0"
3
+ .TH canon-adapter-validate 1 "validate 0.39.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.38.0
44
+ v0.39.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.38.0"
3
+ .TH canon-adapter 1 "adapter 0.39.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.38.0
46
+ v0.39.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.38.0"
3
+ .TH canon-artifacts-move 1 "move 0.39.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.38.0
63
+ v0.39.0
@@ -1,6 +1,6 @@
1
1
  .ie \n(.g .ds Aq \(aq
2
2
  .el .ds Aq '
3
- .TH canon-artifacts-prune 1 "prune 0.38.0"
3
+ .TH canon-artifacts-prune 1 "prune 0.39.0"
4
4
  .SH NAME
5
5
  canon\-artifacts\-prune \- Delete the artifact blobs no record binds any more (the bare run previews; \-\-commit \-\-plan\-digest deletes)
6
6
  .SH SYNOPSIS
@@ -70,6 +70,8 @@ The bare run previews: it says how many blobs and bytes go and stay, why each ke
70
70
 
71
71
  A deleted local blob leaves the working tree, so commit the removal with the ledger; it stays in git history, and shrinking that history is the repo owner\*(Aqs call, not this command\*(Aqs. A deleted object of a tier cannot be undone: the tier keeps no other copy. A delete that fails stops the run (ARTIFACTS_PRUNE_INCOMPLETE says what was deleted); a new preview lists what remains.
72
72
 
73
+ It also deletes the stale temp files a killed blob write left in .canon/artifacts/sha256 (`.tmp\-<sha256>\-<pid>\-<nanos>`, a regular file modified over five minutes ago; a younger file, a link, a directory or any other name stays): the preview lists them in data.staleTemps, the plan digest covers them, and the commit checks each again under the store lock. A temp file is no finished blob, so deleting it changes no record; one git already tracks must be taken out of the commit. `canon artifacts verify` only counts them.
74
+
73
75
  Exit 0 for a preview or a commit, 1 when a delete failed, 2 when the plan is stale or the records or the store cannot be read.
74
76
  .SH VERSION
75
- v0.38.0
77
+ v0.39.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.38.0"
3
+ .TH canon-artifacts-store 1 "store 0.39.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.38.0
54
+ v0.39.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.38.0"
3
+ .TH canon-artifacts-verify 1 "verify 0.39.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
@@ -44,5 +44,7 @@ Print version
44
44
  Asks the store canon.yaml\*(Aqs `artifacts:` block selects (default: local, .canon/artifacts/sha256) about each bound file, the way `canon gate check` does. For an object store that is one HEAD per distinct digest plus the size and sha256 metadata written at upload; \-\-full downloads each blob and re\-hashes it.
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
+
48
+ It also counts the stale temp files a killed blob write left in .canon/artifacts/sha256 (`.tmp\-<sha256>\-<pid>\-<nanos>`, modified over five minutes ago): data.staleTemps has their files and bytes (unreadable, never 0, when the directory cannot be read) and a line names `canon artifacts prune`, which deletes them. verify deletes nothing, and a temp file never changes the exit.
47
49
  .SH VERSION
48
- v0.38.0
50
+ v0.39.0
@@ -1,6 +1,6 @@
1
1
  .ie \n(.g .ds Aq \(aq
2
2
  .el .ds Aq '
3
- .TH canon-artifacts 1 "artifacts 0.38.0"
3
+ .TH canon-artifacts 1 "artifacts 0.39.0"
4
4
  .SH NAME
5
5
  canon\-artifacts \- Check or move the evidence artifact store (local, or an object\-store tier)
6
6
  .SH SYNOPSIS
@@ -45,4 +45,4 @@ Move the local artifact blobs to an object\-store tier, verify them, and remove
45
45
  canon\-artifacts\-prune(1)
46
46
  Delete the artifact blobs no record binds any more (the bare run previews; \-\-commit \-\-plan\-digest deletes)
47
47
  .SH VERSION
48
- v0.38.0
48
+ v0.39.0
@@ -1,6 +1,6 @@
1
1
  .ie \n(.g .ds Aq \(aq
2
2
  .el .ds Aq '
3
- .TH canon-brief-approve 1 "approve 0.38.0"
3
+ .TH canon-brief-approve 1 "approve 0.39.0"
4
4
  .SH NAME
5
5
  canon\-brief\-approve \- Record the human\*(Aqs approval of the brief, bound to its text; refused while `brief check` has blockers
6
6
  .SH SYNOPSIS
@@ -74,4 +74,4 @@ chore whose approval saw the code tree that is still the current one asks for no
74
74
  not approved (BRIEF_APPROVAL_STALE) until a human answers again and this
75
75
  runs again. Run it only from the human\*(Aqs answer, with their words as \-\-note.
76
76
  .SH VERSION
77
- v0.38.0
77
+ v0.39.0
@@ -1,6 +1,6 @@
1
1
  .ie \n(.g .ds Aq \(aq
2
2
  .el .ds Aq '
3
- .TH canon-brief-check 1 "check 0.38.0"
3
+ .TH canon-brief-check 1 "check 0.39.0"
4
4
  .SH NAME
5
5
  canon\-brief\-check \- Read the brief against the rules: blocker and advisory findings (exit 0 clean, 1 blockers, 2 refused)
6
6
  .SH SYNOPSIS
@@ -41,4 +41,4 @@ Print version
41
41
  [\fICHANGE_ID\fR]
42
42
  The change to read (default: the repo\*(Aqs only live change)
43
43
  .SH VERSION
44
- v0.38.0
44
+ v0.39.0
@@ -1,6 +1,6 @@
1
1
  .ie \n(.g .ds Aq \(aq
2
2
  .el .ds Aq '
3
- .TH canon-brief-show 1 "show 0.38.0"
3
+ .TH canon-brief-show 1 "show 0.39.0"
4
4
  .SH NAME
5
5
  canon\-brief\-show \- Show where the change stands and the next one to three steps; never edits
6
6
  .SH SYNOPSIS
@@ -50,4 +50,4 @@ Examples:
50
50
 
51
51
  The operand names the change; without it the repo\*(Aqs only live change is read.
52
52
  .SH VERSION
53
- v0.38.0
53
+ v0.39.0
package/man/canon-brief.1 CHANGED
@@ -1,6 +1,6 @@
1
1
  .ie \n(.g .ds Aq \(aq
2
2
  .el .ds Aq '
3
- .TH canon-brief 1 "brief 0.38.0"
3
+ .TH canon-brief 1 "brief 0.39.0"
4
4
  .SH NAME
5
5
  canon\-brief \- Check a change\*(Aqs brief (PRD format) and see the next steps; never edits
6
6
  .SH SYNOPSIS
@@ -61,4 +61,4 @@ gets one blocker, `brief.old\-format`: `canon migrate` rewrites it. A brief
61
61
  with fewer than two known headings (written before 0.19) checks as `brief.legacy`, an
62
62
  advisory. Without \-\-change, the repo\*(Aqs only live change is checked.
63
63
  .SH VERSION
64
- v0.38.0
64
+ v0.39.0
@@ -1,6 +1,6 @@
1
1
  .ie \n(.g .ds Aq \(aq
2
2
  .el .ds Aq '
3
- .TH canon-change-new 1 "new 0.38.0"
3
+ .TH canon-change-new 1 "new 0.39.0"
4
4
  .SH NAME
5
5
  canon\-change\-new \- Write .canon/changes/<slug>/brief.md, import it, and adopt it into a subject
6
6
  .SH SYNOPSIS
@@ -63,4 +63,4 @@ Print version
63
63
  <\fICHANGE_ID\fR>
64
64
  The change\*(Aqs slug (its change_id)
65
65
  .SH VERSION
66
- v0.38.0
66
+ v0.39.0
@@ -1,6 +1,6 @@
1
1
  .ie \n(.g .ds Aq \(aq
2
2
  .el .ds Aq '
3
- .TH canon-change 1 "change 0.38.0"
3
+ .TH canon-change 1 "change 0.39.0"
4
4
  .SH NAME
5
5
  canon\-change \- Write a plan change (.canon/changes/<slug>/brief.md) and adopt it into a subject
6
6
  .SH SYNOPSIS
@@ -39,4 +39,4 @@ Write .canon/changes/<slug>/brief.md, import it, and adopt it into a subject
39
39
  Examples:
40
40
  canon change new add\-login \-\-subject auth \-\-title \*(AqAdd login\*(Aq
41
41
  .SH VERSION
42
- v0.38.0
42
+ v0.39.0
@@ -1,6 +1,6 @@
1
1
  .ie \n(.g .ds Aq \(aq
2
2
  .el .ds Aq '
3
- .TH canon-completion 1 "completion 0.38.0"
3
+ .TH canon-completion 1 "completion 0.39.0"
4
4
  .SH NAME
5
5
  canon\-completion \- Write the shell completion script for canon (bash, zsh or fish)
6
6
  .SH SYNOPSIS
@@ -57,4 +57,4 @@ Examples:
57
57
 
58
58
  The script is generated from the command tree, so it completes exactly what the parser accepts. It needs no repo and no network.
59
59
  .SH VERSION
60
- v0.38.0
60
+ v0.39.0
@@ -1,6 +1,6 @@
1
1
  .ie \n(.g .ds Aq \(aq
2
2
  .el .ds Aq '
3
- .TH canon-context-pack-add 1 "add 0.38.0"
3
+ .TH canon-context-pack-add 1 "add 0.39.0"
4
4
  .SH NAME
5
5
  canon\-context\-pack\-add \- Create an immutable context pack from a repository\-local JSON manifest
6
6
  .SH SYNOPSIS
@@ -44,4 +44,4 @@ Print help
44
44
  \fB\-V\fR, \fB\-\-version\fR
45
45
  Print version
46
46
  .SH VERSION
47
- v0.38.0
47
+ v0.39.0