canon-ai 3.7.0 → 3.8.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,12 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [3.8.0] — 2026-10-07
8
+
9
+ ### Changed
10
+
11
+ - **`/canon-spec-review`'s factual reviewer now runs on Haiku.** The reviewer that checks a spec's paths, symbols, and signatures against the code now runs on `haiku`. Its work is lookups, so the smaller model is enough and costs less. The shape and spec-quality reviewers still use your session's model. Run `canon upgrade`, then start a new Claude Code session to pick it up.
12
+
7
13
  ## [3.7.0] — 2026-10-06
8
14
 
9
15
  ### Added
package/dist/cli/index.js CHANGED
@@ -1224,7 +1224,7 @@ function checkTemplates(cwd) {
1224
1224
  }
1225
1225
  function checkCanonVersion(cwd) {
1226
1226
  const versionPath = join(cwd, ".canon", "version");
1227
- const installedVersion = "3.7.0";
1227
+ const installedVersion = "3.8.0";
1228
1228
  if (!existsSync(versionPath)) {
1229
1229
  return { label: ".canon/version", status: "warn", detail: "missing \u2014 run `canon upgrade`" };
1230
1230
  }
@@ -1721,7 +1721,7 @@ function initCmd(_args) {
1721
1721
  }
1722
1722
  function writeCanonVersion(cwd) {
1723
1723
  const versionPath = join2(cwd, ".canon", "version");
1724
- const version = "3.7.0";
1724
+ const version = "3.8.0";
1725
1725
  mkdirSync(dirname2(versionPath), { recursive: true });
1726
1726
  writeFileSync(versionPath, version + "\n");
1727
1727
  }
@@ -2731,7 +2731,7 @@ function isInstalledSourcePath(sourcePath) {
2731
2731
  return sourcePath.includes("/node_modules/") || sourcePath.includes("\\node_modules\\") || sourcePath.includes("/_npx/") || sourcePath.includes("\\_npx\\");
2732
2732
  }
2733
2733
  function resolveCanonVersion(explicit) {
2734
- return explicit ?? "3.7.0" ?? "dev";
2734
+ return explicit ?? "3.8.0" ?? "dev";
2735
2735
  }
2736
2736
  function resolveOrchestratorCommit(repoRoot, upstreamCommit, runGitAt) {
2737
2737
  const ownToplevel = captureGitOutput(repoRoot, ["rev-parse", "--show-toplevel"], runGitAt);
@@ -4893,7 +4893,7 @@ function currentPinFromManifest(manifest) {
4893
4893
  return "unknown";
4894
4894
  }
4895
4895
  function bakedVersion() {
4896
- return "3.7.0";
4896
+ return "3.8.0";
4897
4897
  }
4898
4898
  function ownPackageName(pkgDir) {
4899
4899
  try {
@@ -5370,7 +5370,7 @@ function runUpgrade(cwd, pkgDir, options = {}) {
5370
5370
  cutoverWarnings.push(docsRefsCheckRel);
5371
5371
  }
5372
5372
  const versionPath = join5(cwd, ".canon", "version");
5373
- const newVersion = "3.7.0";
5373
+ const newVersion = "3.8.0";
5374
5374
  const currentVersion = existsSync5(versionPath) ? readFileSync4(versionPath, "utf8").trim() : null;
5375
5375
  if (currentVersion !== newVersion) {
5376
5376
  pending.push({ rel: ".canon/version", projectPath: versionPath, content: newVersion + "\n" });
@@ -5678,7 +5678,7 @@ Global:
5678
5678
  `);
5679
5679
  }
5680
5680
  function printVersion() {
5681
- console.log("3.7.0");
5681
+ console.log("3.8.0");
5682
5682
  }
5683
5683
  switch (command) {
5684
5684
  case "doctor":
@@ -5205,7 +5205,7 @@ function isInstalledSourcePath(sourcePath) {
5205
5205
  return sourcePath.includes("/node_modules/") || sourcePath.includes("\\node_modules\\") || sourcePath.includes("/_npx/") || sourcePath.includes("\\_npx\\");
5206
5206
  }
5207
5207
  function resolveCanonVersion(explicit) {
5208
- return explicit ?? "3.7.0" ?? "dev";
5208
+ return explicit ?? "3.8.0" ?? "dev";
5209
5209
  }
5210
5210
  function resolveOrchestratorCommit(repoRoot, upstreamCommit, runGitAt) {
5211
5211
  const ownToplevel = captureGitOutput(repoRoot, ["rev-parse", "--show-toplevel"], runGitAt);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "canon-ai",
3
- "version": "3.7.0",
3
+ "version": "3.8.0",
4
4
  "type": "module",
5
5
  "description": "A spec-first, multi-agent AI coding pipeline you drop into any repo. The law your agents work under.",
6
6
  "engines": {
@@ -10,7 +10,7 @@ Review the spec yourself and spawn no sub-agents.
10
10
  Invoke no skills.
11
11
  Write no files. Run no `canon` commands and ask the user nothing.
12
12
  Bash is read-only: search, list, print file ranges, and inspect read-only git history. Use no redirects, in-place edits, or state-changing git.
13
- Inherit the session's model and effort.
13
+ Inherit the session's model and effort unless the dispatching call sets a model.
14
14
 
15
15
  Every finding cites `file:line` or an AC number. Re-open the current file before making any claim about code; do not rely on memory.
16
16
 
@@ -39,7 +39,7 @@ State briefly: task ID, size, delicate flag, "dispatching 3 parallel sub-agents.
39
39
 
40
40
  ### 2. Dispatch 3 sub-agents in one message
41
41
 
42
- Send a SINGLE message with three Agent tool calls so they run concurrently. Every call uses `subagent_type: spec-review-lens` and carries the full spec text inline, its angle, scope and rubric. Each lens returns cited findings in its own format. If the Agent tool rejects `spec-review-lens`, stop and tell the human to run `canon upgrade`, then start a new Claude Code session; do not fall back to another agent type.
42
+ Send a SINGLE message with three Agent tool calls so they run concurrently. Every call uses `subagent_type: spec-review-lens` and carries the full spec text inline, its angle, scope and rubric. Agent B's call also passes `model: haiku`; its lookups are mechanical, while A and C need judgment and inherit the session model. Each lens returns cited findings in its own format. If the Agent tool rejects `spec-review-lens`, stop and tell the human to run `canon upgrade`, then start a new Claude Code session; do not fall back to another agent type.
43
43
 
44
44
  #### Agent A — Structural / shape
45
45