canon-ai 3.8.0 → 3.10.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/CHANGELOG.md CHANGED
@@ -4,6 +4,33 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [3.10.0] — 2026-10-17
8
+
9
+ ### Changed
10
+
11
+ - **Parallel tasks no longer conflict on the shared telemetry logs.** While a task runs, its metrics rows, quality-log row and QA lessons go to its own files in its task folder. `canon run --ship` folds them into `docs/pipeline-invocations.md`, `docs/task-quality-log.md` and `docs/lessons-learned.md` in the archive commit it already makes on the base branch. Two task PRs no longer touch those three files, so they no longer conflict there, on GitHub or locally. Tasks started on an older canon still merge their log edits the old way.
12
+
13
+ ### Added
14
+
15
+ - **`--pr` warns when a task branch still edits a shared telemetry log.** The warning names each file and doesn't block the PR.
16
+ - **A `--ship` failure after the fold says where the folded rows are.** If the archive move, commit or push fails after the logs were folded, the message names the affected logs, says the task's fragments are already gone, says not to reset those docs, and points to the recovery steps in the pipeline reference.
17
+
18
+ ## [3.9.0] — 2026-10-16
19
+
20
+ ### Added
21
+
22
+ - **`.canon/config.json` sets which docs QA keeps fresh.** Under `docs_freshness`, map source-path globs to the docs QA must check when a task touches matching files (`paths`), list docs QA should report under "Docs drift" in `done.md` instead of editing (`flag_only`), or replace the default protected set (`protected`). The file is yours: `canon init` doesn't create it and `canon upgrade` never changes it. A malformed file stops every `canon run` form before it changes any state, and `canon doctor` reports the file's status. See "Configuring docs freshness" in the canon-ai README.
23
+
24
+ ### Changed
25
+
26
+ - **QA's doc list and the QA commit allowlist now come from the same set.** QA's prompt names the protected docs plus any mapped docs whose globs match the task's changes. Previously the prompt named five docs while the allowlist admitted six.
27
+ - **`docs/pipeline-orchestrator.md` is no longer a default protected doc.** It is a canon-managed file in your repo, and `canon upgrade` overwrites it, so QA edits there didn't last.
28
+
29
+ ### Fixed
30
+
31
+ - **`--ship` and the QA and human-review commits no longer split file names that contain ` -> `.** Only renamed or copied entries in git status are read as an `old -> new` pair.
32
+ - **File names with non-ASCII or special characters now match their real paths.** Git quotes such names in its status and diff output (for example `docs/😀.md`), and canon compared the quoted form. The QA-end and human-review commits could reject the file, implement's auto-commit checks could miss it, and `--ship` could overlook it as dirty. Canon now decodes the quoting first.
33
+
7
34
  ## [3.8.0] — 2026-10-07
8
35
 
9
36
  ### Changed
package/README.md CHANGED
@@ -304,6 +304,45 @@ diff .canon/templates/spec.md tasks/_templates/spec.md
304
304
 
305
305
  See `.canon/README.md` for a quick reference.
306
306
 
307
+ ### Configuring docs freshness
308
+
309
+ Create an adopter-owned `.canon/config.json` to tell QA which docs to keep current:
310
+
311
+ ```json
312
+ {
313
+ "docs_freshness": {
314
+ "protected": ["docs/architecture.md", "docs/codebase-map.md"],
315
+ "paths": {
316
+ "api/**": ["docs/api-contract.md", "docs/environment-variables.md"],
317
+ "**": ["docs/ROADMAP.md", "AGENTS.md"]
318
+ },
319
+ "flag_only": ["AGENTS.md"]
320
+ }
321
+ }
322
+ ```
323
+
324
+ `protected` **replaces** the defaults: architecture, codebase-map, patterns,
325
+ product-context, and decisions. Omit it to keep those defaults; use `[]` to clear
326
+ them. Add docs through `paths`, using `"**"` to check one on every task.
327
+ Globs support `**`, `*`, `?`, and `{a,b}`; wildcards match dotfiles and hidden
328
+ directories too. Brace alternatives must be one level and stay within a single
329
+ path segment; nested braces and alternatives containing slashes are unsupported.
330
+ Keys match file paths: use a glob such as `api/**` rather than a directory-only
331
+ key ending in a slash. QA scans mapped docs when the task's committed diff matches,
332
+ while every mapped doc stays eligible for QA commits across later review rounds.
333
+
334
+ `flag_only` removes docs from QA's edit permission. When selected by the protected
335
+ set or a matching mapping, QA reports stale statements in a **Docs drift** section
336
+ of the QA summary instead. An implementer may still edit a flag-only doc explicitly
337
+ listed in the spec's Affected Files.
338
+
339
+ `canon init` does not create this file and `canon upgrade` leaves it alone.
340
+ Commit the config before starting worktree-isolated tasks: each worktree reads its
341
+ branch's copy, so uncommitted main-checkout changes are not available there.
342
+ Malformed config stops runs, including reroute and ship, and fails the docs-freshness
343
+ check in `canon doctor`; unknown keys warn. Telemetry files and task-artifact paths
344
+ cannot be configured. Without a config, the default protected set applies.
345
+
307
346
  ## Architecture: two layers
308
347
 
309
348
  Canon is two products: