@erclx/canon 5.30.0 → 5.32.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 (343) hide show
  1. package/README.md +1 -1
  2. package/claude/.claude-plugin/plugin.json +1 -1
  3. package/claude/skills/api-design/references/adopted.md +1 -1
  4. package/claude/skills/auto-ship/REQUIREMENT.md +4 -16
  5. package/claude/skills/auto-ship/SKILL.md +13 -58
  6. package/claude/skills/auto-ship/references/draft-mark.md +2 -2
  7. package/claude/skills/auto-ship/references/failure-recovery.md +1 -5
  8. package/claude/skills/auto-ship/references/tier-failures.md +1 -1
  9. package/claude/skills/auto-ship/references/ui-checklist.md +2 -2
  10. package/claude/skills/auto-ship/references/verb-absent.md +3 -27
  11. package/claude/skills/backlog-triage/SKILL.md +1 -1
  12. package/claude/skills/build-in-slices/REQUIREMENT.md +1 -1
  13. package/claude/skills/build-in-slices/references/adopted.md +1 -1
  14. package/claude/skills/canon-cli/REQUIREMENT.md +4 -6
  15. package/claude/skills/canon-cli/SKILL.md +2 -2
  16. package/claude/skills/canon-feedback/REQUIREMENT.md +1 -1
  17. package/claude/skills/canon-feedback/SKILL.md +10 -13
  18. package/claude/skills/canon-feedback-triage/REQUIREMENT.md +13 -14
  19. package/claude/skills/canon-feedback-triage/SKILL.md +50 -29
  20. package/claude/skills/canvas/REQUIREMENT.md +3 -4
  21. package/claude/skills/canvas/SKILL.md +5 -5
  22. package/{standards → claude/skills/canvas/references}/canvas.md +12 -1
  23. package/claude/skills/ci-workflow/REQUIREMENT.md +0 -1
  24. package/claude/skills/context-fold/REQUIREMENT.md +8 -20
  25. package/claude/skills/context-fold/SKILL.md +21 -45
  26. package/claude/skills/context-fold/references/classify.md +7 -8
  27. package/claude/skills/context-fold/references/completion-report.md +2 -6
  28. package/claude/skills/context-fold/references/context-refresh.md +5 -15
  29. package/claude/skills/context-fold/references/promoted-pages.md +3 -3
  30. package/claude/skills/context-fold/references/receipt-sweep.md +6 -17
  31. package/claude/skills/context-fold/references/unusable-baseline.md +4 -6
  32. package/claude/skills/create-rule/REQUIREMENT.md +0 -1
  33. package/claude/skills/create-skill/REQUIREMENT.md +6 -4
  34. package/claude/skills/create-skill/SKILL.md +9 -8
  35. package/{standards → claude/skills/create-skill/references}/skill-paths.md +1 -0
  36. package/claude/skills/decision-escalate/REQUIREMENT.md +1 -1
  37. package/claude/skills/decision-escalate/SKILL.md +1 -1
  38. package/claude/skills/design-taste/REQUIREMENT.md +0 -2
  39. package/claude/skills/design-taste/SKILL.md +2 -4
  40. package/claude/skills/design-taste/references/vocabulary.md +1 -1
  41. package/claude/skills/docs-sync/REQUIREMENT.md +3 -3
  42. package/claude/skills/docs-sync/SKILL.md +1 -1
  43. package/claude/skills/document-health/REQUIREMENT.md +2 -2
  44. package/claude/skills/document-health/SKILL.md +4 -5
  45. package/claude/skills/document-health/references/axes.md +4 -6
  46. package/claude/skills/draft-and-pick/REQUIREMENT.md +16 -14
  47. package/claude/skills/draft-and-pick/SKILL.md +40 -32
  48. package/claude/skills/draft-and-pick/references/live-arms.md +9 -9
  49. package/claude/skills/draft-doc/REQUIREMENT.md +5 -5
  50. package/claude/skills/draft-doc/SKILL.md +10 -11
  51. package/claude/skills/draft-doc/references/requirements.md +61 -0
  52. package/claude/skills/draft-doc/references/wiki-kind.md +53 -0
  53. package/claude/skills/draft-doc/references/wiki.md +50 -30
  54. package/claude/skills/draft-figure/REQUIREMENT.md +2 -2
  55. package/claude/skills/draft-figure/SKILL.md +5 -5
  56. package/claude/skills/draft-figure/references/architecture-set.md +4 -4
  57. package/claude/skills/draft-figure/references/hand-drawn.md +1 -1
  58. package/claude/skills/draft-figure/references/mermaid-path.md +55 -0
  59. package/claude/skills/draft-figure/references/mermaid.md +43 -34
  60. package/claude/skills/draft-identity/REQUIREMENT.md +1 -1
  61. package/claude/skills/draft-identity/SKILL.md +9 -7
  62. package/claude/skills/draft-ready/REQUIREMENT.md +1 -1
  63. package/claude/skills/draft-ready/SKILL.md +6 -6
  64. package/claude/skills/draft-ready/references/assembly.md +1 -1
  65. package/{standards → claude/skills/draft-ready/references}/ready.md +13 -5
  66. package/claude/skills/git-issue/SKILL.md +1 -1
  67. package/claude/skills/git-issue/references/issue.md +3 -3
  68. package/claude/skills/git-pr/SKILL.md +1 -1
  69. package/claude/skills/git-ship/REQUIREMENT.md +0 -2
  70. package/claude/skills/git-ship/SKILL.md +16 -24
  71. package/claude/skills/git-stage/SKILL.md +1 -1
  72. package/claude/skills/markdown-craft/REQUIREMENT.md +23 -0
  73. package/claude/skills/markdown-craft/SKILL.md +17 -0
  74. package/{standards → claude/skills/markdown-craft/references}/markdown.md +14 -7
  75. package/claude/skills/plan-feature/REQUIREMENT.md +2 -1
  76. package/claude/skills/plan-feature/SKILL.md +14 -8
  77. package/{standards → claude/skills/plan-feature/references}/plan.md +33 -21
  78. package/claude/skills/plan-groundwork/SKILL.md +5 -6
  79. package/{standards → claude/skills/plan-groundwork/references}/groundwork.md +17 -4
  80. package/claude/skills/plan-intake/SKILL.md +2 -3
  81. package/{standards → claude/skills/plan-intake/references}/intake.md +17 -2
  82. package/claude/skills/plan-intake-answer/REQUIREMENT.md +1 -1
  83. package/claude/skills/plan-intake-answer/SKILL.md +1 -1
  84. package/claude/skills/review-address/SKILL.md +2 -2
  85. package/claude/skills/review-address/references/post-review-findings.md +1 -1
  86. package/claude/skills/review-craft/REQUIREMENT.md +3 -3
  87. package/claude/skills/review-craft/SKILL.md +2 -2
  88. package/claude/skills/review-craft/references/ui.md +4 -4
  89. package/claude/skills/review-pr/REQUIREMENT.md +1 -1
  90. package/claude/skills/review-pr/SKILL.md +5 -7
  91. package/claude/skills/review-pr/references/post.md +2 -2
  92. package/claude/skills/review-ui/REQUIREMENT.md +0 -1
  93. package/claude/skills/review-ui/SKILL.md +1 -1
  94. package/claude/skills/review-ui/references/post.md +1 -1
  95. package/claude/skills/role-orchestrator/REQUIREMENT.md +0 -3
  96. package/claude/skills/role-orchestrator/SKILL.md +8 -8
  97. package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +4 -3
  98. package/claude/skills/role-orchestrator/references/orchestrator-handoff.md +7 -10
  99. package/claude/skills/role-orchestrator/references/orchestrator-parked.md +2 -2
  100. package/claude/skills/role-orchestrator/references/orchestrator-refill.md +0 -3
  101. package/claude/skills/role-orchestrator/references/orchestrator-resume.md +1 -1
  102. package/claude/skills/role-planner/SKILL.md +2 -2
  103. package/claude/skills/role-reviewer/SKILL.md +1 -1
  104. package/claude/skills/role-worker/SKILL.md +2 -2
  105. package/claude/skills/session-compact/REQUIREMENT.md +1 -4
  106. package/claude/skills/session-compact/SKILL.md +3 -13
  107. package/claude/skills/session-compact/references/handoff-note.md +2 -2
  108. package/claude/skills/session-map/REQUIREMENT.md +1 -9
  109. package/claude/skills/session-map/SKILL.md +8 -16
  110. package/{standards → claude/skills/session-map/references}/session.md +17 -11
  111. package/claude/skills/session-relay/REQUIREMENT.md +1 -1
  112. package/claude/skills/session-resume/REQUIREMENT.md +4 -6
  113. package/claude/skills/session-resume/SKILL.md +3 -9
  114. package/claude/skills/session-worktree/SKILL.md +1 -1
  115. package/claude/skills/session-worktree/references/main-root-writes.md +2 -2
  116. package/claude/skills/systematic-debugging/REQUIREMENT.md +0 -1
  117. package/claude/skills/target-check/REQUIREMENT.md +3 -3
  118. package/claude/skills/target-check/SKILL.md +1 -1
  119. package/claude/skills/target-check/references/domains.md +1 -1
  120. package/claude/skills/target-setup/REQUIREMENT.md +4 -4
  121. package/claude/skills/target-setup/SKILL.md +3 -3
  122. package/claude/skills/target-setup/references/detect.md +1 -1
  123. package/claude/skills/target-setup/references/indexes.md +1 -1
  124. package/claude/skills/task-board/SKILL.md +4 -4
  125. package/claude/skills/task-board/references/archive.md +1 -1
  126. package/{standards → claude/skills/task-board/references}/board.md +9 -0
  127. package/claude/skills/task-board/references/decline.md +1 -1
  128. package/{standards → claude/skills/task-board/references}/tasks.md +13 -8
  129. package/claude/skills/teach-workspace/SKILL.md +1 -1
  130. package/claude/skills/teach-workspace/references/revisit.md +1 -1
  131. package/{standards → claude/skills/teach-workspace/references}/teach.md +17 -5
  132. package/claude/skills/test-first/REQUIREMENT.md +1 -1
  133. package/claude/skills/ux-audit/REQUIREMENT.md +2 -2
  134. package/claude/skills/ux-audit/SKILL.md +2 -3
  135. package/claude/skills/write-human/REQUIREMENT.md +0 -1
  136. package/claude/skills/write-human/SKILL.md +2 -2
  137. package/docs/agents/audits.md +1 -1
  138. package/docs/agents/canvas.md +1 -1
  139. package/docs/agents/commands.md +6 -10
  140. package/docs/agents/context-audit-checks.md +10 -24
  141. package/docs/agents/context-audit.md +7 -15
  142. package/docs/agents/context-classify.md +5 -5
  143. package/docs/agents/counts.md +5 -5
  144. package/docs/agents/drift-surfaces.md +2 -2
  145. package/docs/agents/index.md +3 -4
  146. package/docs/agents/install-and-sync.md +6 -6
  147. package/docs/agents/intake.md +1 -1
  148. package/docs/agents/markdown-audit.md +1 -1
  149. package/docs/agents/records-stale.md +5 -5
  150. package/docs/agents/records-validate.md +1 -1
  151. package/docs/agents/records.md +2 -2
  152. package/docs/agents/restated.md +1 -1
  153. package/docs/agents/routing.md +1 -1
  154. package/docs/agents/rule-citations.md +1 -1
  155. package/docs/agents/skills-audit.md +2 -2
  156. package/docs/agents/state-scoped-risk.md +2 -2
  157. package/docs/agents/superseded.md +2 -2
  158. package/docs/agents/tasks-plans.md +2 -2
  159. package/docs/agents/tasks-validate.md +1 -1
  160. package/docs/agents/tasks.md +1 -1
  161. package/docs/agents/teach.md +1 -1
  162. package/docs/agents/test-order.md +1 -1
  163. package/docs/agents/upstream.md +94 -0
  164. package/docs/target/migrations.md +24 -0
  165. package/docs/target/projects.md +5 -7
  166. package/docs/target/scenarios.md +2 -2
  167. package/docs/target/sync.md +3 -3
  168. package/docs/workflow/ai-workflow.md +7 -38
  169. package/docs/workflow/index.md +1 -1
  170. package/docs/workflow/operating-model.md +8 -8
  171. package/docs/workflow/parallel-features.md +7 -7
  172. package/docs/workflow/skill-map-on-request.md +13 -16
  173. package/docs/workflow/skill-map.md +20 -32
  174. package/docs/workflow/visual-design-workflow.md +11 -14
  175. package/governance/renames.toml +0 -23
  176. package/governance/rules/canon/605-worktrees.md +1 -1
  177. package/governance/rules/{standards → canon}/plan.md +5 -5
  178. package/governance/rules/canon/tasks.md +18 -0
  179. package/governance/rules/writing/markdown.md +23 -0
  180. package/governance/stacks/base.toml +1 -1
  181. package/package.json +1 -1
  182. package/scripts/core/install-check.sh +2 -2
  183. package/scripts/core/regen-web-previews.ts +1 -1
  184. package/src/audits/catalog.ts +5 -97
  185. package/src/claude/cases/authoring.ts +5 -18
  186. package/src/claude/cases/misc.ts +0 -17
  187. package/src/claude/cases/setup.ts +3 -20
  188. package/src/claude/cases/workflow.ts +0 -33
  189. package/src/claude/seeds.ts +1 -7
  190. package/src/claude/skills-audit.ts +1 -1
  191. package/src/claude/skills-reach.ts +1 -1
  192. package/src/cli/help.ts +3 -4
  193. package/src/cli.ts +2 -4
  194. package/src/commands/claude.ts +9 -15
  195. package/src/commands/context.ts +18 -280
  196. package/src/commands/feedback.ts +22 -91
  197. package/src/commands/gov.ts +2 -2
  198. package/src/commands/records.ts +24 -6
  199. package/src/commands/sync.ts +5 -3
  200. package/src/commands/upstream.ts +430 -0
  201. package/src/context/audit.ts +6 -15
  202. package/src/context/classify/extract.ts +6 -13
  203. package/src/context/classify/patterns.ts +2 -41
  204. package/src/context/classify/prompts.ts +2 -6
  205. package/src/context/classify/run.ts +3 -3
  206. package/src/context/folders.ts +7 -12
  207. package/src/context/gate.ts +11 -91
  208. package/src/context/requirements.ts +13 -4
  209. package/src/counts/scan.ts +3 -3
  210. package/src/design/components.ts +2 -2
  211. package/src/feedback/body.ts +0 -12
  212. package/src/gate/measures.ts +6 -57
  213. package/src/gate/stages.ts +0 -1
  214. package/src/gov/citations.ts +9 -3
  215. package/src/gov/restated.ts +3 -3
  216. package/src/markdown/structure.ts +3 -3
  217. package/src/migrate/record-layout.ts +3 -3
  218. package/src/records/backup.ts +1 -0
  219. package/src/records/ordinal.ts +1 -1
  220. package/src/records/prune.ts +2 -1
  221. package/src/records/stale-canonical.ts +2 -2
  222. package/src/records/validate.ts +55 -0
  223. package/src/roots/record.ts +2 -1
  224. package/src/sandbox/scenario.ts +115 -11
  225. package/src/shipped/references.ts +3 -3
  226. package/src/standards/read.ts +52 -1
  227. package/src/sync/seeds-report.ts +1 -1
  228. package/src/tasks/answers.ts +14 -1
  229. package/src/tasks/reach.ts +2 -2
  230. package/src/tasks/stack.ts +176 -0
  231. package/src/tasks/validate.ts +1 -1
  232. package/src/teach/workspace.ts +1 -1
  233. package/src/upstream/catalog.ts +112 -0
  234. package/src/upstream/cursor.ts +120 -0
  235. package/src/upstream/digest.ts +75 -0
  236. package/src/upstream/due.ts +128 -0
  237. package/src/upstream/releases.ts +170 -0
  238. package/standards/context.md +3 -5
  239. package/standards/design.md +2 -3
  240. package/standards/index.md +0 -23
  241. package/standards/publish.md +1 -1
  242. package/standards/rule.md +1 -1
  243. package/standards/skill.md +1 -1
  244. package/tooling/base/reference.md +1 -1
  245. package/tooling/claude/reference.md +6 -20
  246. package/tooling/claude/seeds/.claude/hooks/index-reminder.sh +1 -1
  247. package/tooling/claude/seeds/.claude/hooks/records-index.sh +8 -20
  248. package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +3 -3
  249. package/tooling/claude/seeds/CLAUDE.md +1 -3
  250. package/tooling/claude/seeds/canon/REQUIREMENTS.md +2 -9
  251. package/tooling/web/configs/e2e/screenshot.ts +0 -1
  252. package/claude/skills/auto-ship/references/review-findings.md +0 -20
  253. package/claude/skills/bash-cli-script/REQUIREMENT.md +0 -43
  254. package/claude/skills/bash-cli-script/SKILL.md +0 -53
  255. package/claude/skills/bash-cli-script/references/template.md +0 -19
  256. package/claude/skills/canon-operator/REQUIREMENT.md +0 -62
  257. package/claude/skills/canon-operator/SKILL.md +0 -113
  258. package/claude/skills/canon-rollout/REQUIREMENT.md +0 -59
  259. package/claude/skills/canon-rollout/SKILL.md +0 -140
  260. package/claude/skills/canon-rollout/references/failure-recovery.md +0 -20
  261. package/claude/skills/context-fold/references/anchor-sweep.md +0 -58
  262. package/claude/skills/context-fold/references/wireframe-sweep.md +0 -45
  263. package/claude/skills/create-standard/REQUIREMENT.md +0 -33
  264. package/claude/skills/create-standard/SKILL.md +0 -31
  265. package/claude/skills/design-extract/REQUIREMENT.md +0 -42
  266. package/claude/skills/design-extract/SKILL.md +0 -108
  267. package/claude/skills/draft-and-pick/references/frame.html +0 -118
  268. package/claude/skills/draft-doc/references/wireframes.md +0 -48
  269. package/claude/skills/index-lookup/REQUIREMENT.md +0 -35
  270. package/claude/skills/index-lookup/SKILL.md +0 -44
  271. package/claude/skills/markdown-propose/REQUIREMENT.md +0 -47
  272. package/claude/skills/markdown-propose/SKILL.md +0 -122
  273. package/claude/skills/markdown-propose/references/format.md +0 -118
  274. package/claude/skills/memory-capture/REQUIREMENT.md +0 -50
  275. package/claude/skills/memory-capture/SKILL.md +0 -117
  276. package/claude/skills/memory-review/REQUIREMENT.md +0 -52
  277. package/claude/skills/memory-review/SKILL.md +0 -129
  278. package/claude/skills/memory-review/references/later-phases.md +0 -118
  279. package/claude/skills/memory-review/references/receipt-format.md +0 -64
  280. package/claude/skills/project-commands/REQUIREMENT.md +0 -42
  281. package/claude/skills/project-commands/SKILL.md +0 -87
  282. package/claude/skills/repo-metadata/REQUIREMENT.md +0 -37
  283. package/claude/skills/repo-metadata/SKILL.md +0 -54
  284. package/claude/skills/restate-plainly/REQUIREMENT.md +0 -41
  285. package/claude/skills/restate-plainly/SKILL.md +0 -41
  286. package/claude/skills/review-branch/REQUIREMENT.md +0 -40
  287. package/claude/skills/review-branch/SKILL.md +0 -137
  288. package/claude/skills/seed-sync/REQUIREMENT.md +0 -45
  289. package/claude/skills/seed-sync/SKILL.md +0 -158
  290. package/claude/skills/sketch-design/REQUIREMENT.md +0 -38
  291. package/claude/skills/sketch-design/SKILL.md +0 -94
  292. package/claude/skills/ux-walkthrough/REQUIREMENT.md +0 -56
  293. package/claude/skills/ux-walkthrough/SKILL.md +0 -53
  294. package/claude/skills/ux-walkthrough/references/builds.md +0 -15
  295. package/claude/skills/ux-walkthrough/references/candidate-pages.md +0 -11
  296. package/claude/skills/ux-walkthrough/references/measuring.md +0 -22
  297. package/claude/skills/ux-walkthrough/references/record.md +0 -36
  298. package/claude/skills/ux-walkthrough/references/relay.md +0 -25
  299. package/docs/agents/architecture-record.md +0 -36
  300. package/docs/agents/review-classification.md +0 -76
  301. package/governance/rules/canon/601-indexes.md +0 -9
  302. package/governance/rules/canon/603-memory.md +0 -11
  303. package/governance/rules/claude/565-behavior.md +0 -27
  304. package/governance/rules/claude/567-planning.md +0 -16
  305. package/governance/rules/claude/575-hooks.md +0 -16
  306. package/governance/rules/claude/576-settings.md +0 -13
  307. package/governance/rules/claude/592-claude-md.md +0 -19
  308. package/governance/rules/lang/120-bash.md +0 -18
  309. package/governance/rules/standards/architecture.md +0 -13
  310. package/governance/rules/standards/groundwork.md +0 -13
  311. package/governance/rules/standards/intake.md +0 -12
  312. package/governance/rules/standards/markdown.md +0 -16
  313. package/governance/rules/standards/memory.md +0 -12
  314. package/governance/rules/standards/ready.md +0 -13
  315. package/governance/rules/standards/requirements.md +0 -12
  316. package/governance/rules/standards/session.md +0 -13
  317. package/governance/rules/standards/tasks.md +0 -15
  318. package/governance/rules/standards/teach.md +0 -14
  319. package/governance/rules/standards/wiki.md +0 -13
  320. package/governance/rules/standards/wireframes.md +0 -13
  321. package/governance/rules/writing/800-prose.md +0 -15
  322. package/src/autoship/classify.ts +0 -75
  323. package/src/autoship/paths.ts +0 -50
  324. package/src/commands/autoship.ts +0 -129
  325. package/src/commands/repo.ts +0 -393
  326. package/src/context/architecture.ts +0 -654
  327. package/src/context/wireframe-states.ts +0 -238
  328. package/src/repo/metadata.ts +0 -206
  329. package/standards/architecture.md +0 -127
  330. package/standards/memory.md +0 -158
  331. package/standards/mermaid.md +0 -64
  332. package/standards/requirements.md +0 -79
  333. package/standards/wiki.md +0 -77
  334. package/standards/wireframes.md +0 -143
  335. package/tooling/claude/seeds/.claude/memory/index.md +0 -8
  336. package/tooling/claude/seeds/canon/ARCHITECTURE.md +0 -23
  337. package/tooling/claude/seeds/canon/wireframes/index.md +0 -8
  338. /package/{standards → claude/skills/create-skill/references}/skill-practice.md +0 -0
  339. /package/{standards → claude/skills/create-skill/references}/skill-requirement.md +0 -0
  340. /package/{standards → claude/skills/plan-feature/references}/plan-lifecycle.md +0 -0
  341. /package/{standards → claude/skills/plan-groundwork/references}/groundwork-spikes.md +0 -0
  342. /package/{standards → claude/skills/task-board/references}/tasks-decline.md +0 -0
  343. /package/{standards → claude/skills/teach-workspace/references}/glossary.md +0 -0
package/src/cli/help.ts CHANGED
@@ -58,9 +58,9 @@ export const COMMAND_GROUPS: { title: string; rows: CommandRow[] }[] = [
58
58
  ['sessions [cmd]', 'Resolve live sessions to worktree and branch'],
59
59
  ['worktrees [cmd]', 'Reclaim worktrees whose branches merged'],
60
60
  ['hooks [cmd]', 'Run the steps a git hook drives (post-merge)'],
61
- ['autoship [cmd]', 'Decide whether a changed set needs review'],
62
61
  ['pr [cmd]', 'Read a pull request (key-changes, head, checks)'],
63
- ['feedback', 'Write toolkit feedback from stdin'],
62
+ ['upstream [cmd]', 'Read Claude Code releases (fetch, catalog, advance)'],
63
+ ['feedback', 'File toolkit feedback as a GitHub issue'],
64
64
  ],
65
65
  },
66
66
  {
@@ -74,7 +74,6 @@ export const COMMAND_GROUPS: { title: string; rows: CommandRow[] }[] = [
74
74
  ['comments [cmd]', 'Measure comment density and trend (scan)'],
75
75
  ['context [cmd]', 'Report context folder health (audit)'],
76
76
  ['markdown [cmd]', 'Report markdown against the standards (audit)'],
77
- ['repo [cmd]', 'Remote metadata (metadata propose, apply)'],
78
77
  ['census [path]', 'Report file count, extensions, and line totals'],
79
78
  ],
80
79
  },
@@ -127,11 +126,11 @@ const EXAMPLES = [
127
126
  'canon secrets scan --json',
128
127
  'canon deps audit --json',
129
128
  'canon labels audit --json',
130
- 'canon repo metadata propose --json',
131
129
  'canon census --json',
132
130
  'canon audits run --json',
133
131
  'canon gate run --all --no-write',
134
132
  'canon upgrade --json',
133
+ 'canon upstream fetch --since 2.1.256 --json',
135
134
  ]
136
135
 
137
136
  // The frame follows stdout's TTY state rather than `palette`, whose blank
package/src/cli.ts CHANGED
@@ -37,10 +37,9 @@ import { register as gate } from '@/commands/gate'
37
37
  import { register as secrets } from '@/commands/secrets'
38
38
  import { register as deps } from '@/commands/deps'
39
39
  import { register as labels } from '@/commands/labels'
40
- import { register as autoship } from '@/commands/autoship'
41
40
  import { register as pr } from '@/commands/pr'
42
- import { register as repo } from '@/commands/repo'
43
41
  import { register as census } from '@/commands/census'
42
+ import { register as upstream } from '@/commands/upstream'
44
43
  import { register as targets } from '@/commands/targets'
45
44
  import { register as upgrade } from '@/commands/upgrade'
46
45
  import { readInstalled, UNKNOWN_LABEL } from '@/version/installed'
@@ -98,10 +97,9 @@ hooks(program)
98
97
  secrets(program)
99
98
  deps(program)
100
99
  labels(program)
101
- autoship(program)
102
100
  pr(program)
103
- repo(program)
104
101
  census(program)
102
+ upstream(program)
105
103
  audits(program)
106
104
  gate(program)
107
105
  upgrade(program)
@@ -157,21 +157,17 @@ interface RoutingOptions {
157
157
  readonly json?: boolean
158
158
  }
159
159
 
160
- const SEEDED_FILES: readonly string[] = [
161
- 'ARCHITECTURE.md',
162
- 'REQUIREMENTS.md',
163
- 'DESIGN.md',
164
- ]
165
- const SEEDED_DIRS: readonly string[] = ['memory', 'tasks', 'wireframes']
160
+ const SEEDED_FILES: readonly string[] = ['REQUIREMENTS.md', 'DESIGN.md']
161
+ const SEEDED_DIRS: readonly string[] = ['tasks']
166
162
 
167
163
  /**
168
164
  * Where a `SEEDED_DIRS` entry resolves for the sync presence check.
169
165
  *
170
- * `wireframes` is a tracked surface entry, resolved under `canon/` ahead of
171
- * `.claude/`, while `memory` and `tasks` are session records resolved under
172
- * `.canon/` ahead of `.claude/`. Routing every name through `recordDir`
173
- * reported a migrated target's `canon/wireframes/` as missing, since that
174
- * resolver never checks `canon/`.
166
+ * A tracked surface entry resolves under `canon/` ahead of `.claude/`, while
167
+ * `tasks` is a session record resolved under `.canon/` ahead of
168
+ * `.claude/`. Routing every name through `recordDir` would report a migrated
169
+ * target's surface folder as missing, since that resolver never checks
170
+ * `canon/`.
175
171
  */
176
172
  export function seededDirPath(resolved: string, name: string): string {
177
173
  return SURFACE_ENTRIES.includes(name)
@@ -296,7 +292,7 @@ export function register(program: Command): void {
296
292
  ' 1 refused, with the reason on stderr',
297
293
  '',
298
294
  'Reports rather than gates. Whether a bullet belongs in a rule is the',
299
- 'judgment 592-claude-md states, and naming a path is evidence for it',
295
+ 'judgment canon/context/context-model/overview.md states, and naming a path is evidence for it',
300
296
  'rather than the answer.',
301
297
  '',
302
298
  'Examples:',
@@ -615,9 +611,7 @@ async function runSync(target: string): Promise<number> {
615
611
 
616
612
  // A record folder resolves at either root, so a migrated target is reported as
617
613
  // seeded rather than sent to `canon claude init` to re-create records it
618
- // already holds. `wireframes` is a tracked surface entry instead, resolved
619
- // through `surfaceDir`, since a migrated target holds it at `canon/` rather
620
- // than under either record root.
614
+ // already holds.
621
615
  logStep('Seeded')
622
616
  for (const name of SEEDED_FILES) {
623
617
  if (existsSync(join(resolved, '.claude', name))) logInfo(name)
@@ -18,18 +18,6 @@ import {
18
18
  requiredSections,
19
19
  type SectionFinding,
20
20
  } from '@/context/audit'
21
- import {
22
- architectureRel,
23
- type ArchitectureReport,
24
- coveredCount,
25
- isOverCount,
26
- isOverLength,
27
- isOverRisks,
28
- measureArchitecture,
29
- missingRevisit,
30
- overWords,
31
- testableCount,
32
- } from '@/context/architecture'
33
21
  import { auditCitations, type CitationReport } from '@/context/citations'
34
22
  import {
35
23
  CANONICAL_DOC_TYPES,
@@ -65,10 +53,6 @@ import {
65
53
  type RequirementsReport,
66
54
  } from '@/context/requirements'
67
55
  import { auditIndexes, type FolderDrift } from '@/context/index-drift'
68
- import {
69
- measureWireframeFolder,
70
- type WireframeStatesReport,
71
- } from '@/context/wireframe-states'
72
56
  import { RENDER_WIDTH } from '@/markdown/structure'
73
57
  import {
74
58
  frameError,
@@ -104,7 +88,7 @@ export function register(program: Command): void {
104
88
  context
105
89
  .command('audit')
106
90
  .description(
107
- 'Report required sections, entry length, citations, reference form, catalog tables, provenance, index drift, the architecture record against its own ceiling, entry cap, word cap, and risk cap, the requirements record against its own word cap, and wireframe states against their evidence folders',
91
+ 'Report required sections, entry length, citations, reference form, catalog tables, provenance, index drift, and the requirements record against its own word cap',
108
92
  )
109
93
  .argument('[path]', 'Project root, defaulting to the current directory')
110
94
  .helpOption('-h, --help', 'Show this help message')
@@ -127,21 +111,14 @@ export function register(program: Command): void {
127
111
  ' 1 refused, with the reason on stderr',
128
112
  ' 2 a gating finding is present',
129
113
  '',
130
- 'An unresolved citation always gates. An architecture record that',
131
- 'states its own line allowances gates when it is past the ceiling',
132
- 'those derive, on any run except --citations-only, which never',
133
- 'measures it. A record stating an entry cap gates the same way when',
134
- 'it holds more decisions than the cap, and a record stating that',
135
- 'every decision closes with a revisit sentence gates when one lacks',
136
- 'it. A record stating a word cap a decision or a risk bullet cap',
137
- 'gates past either, and a requirements record stating a word cap',
138
- 'gates past it. A record stating none of these is reported and',
139
- 'never gated. --gate widens the gate to the other two',
140
- 'findings that are facts rather than judgments: a missing required',
141
- 'section and index drift. A context entry requires Overview and',
142
- 'Layout, and a wireframe requires Regions, States, Copy, and Not on',
143
- 'this surface. Entry length, reference form, table, provenance, and the',
144
- 'record claim classification are judgments under both.',
114
+ 'An unresolved citation always gates. A requirements record',
115
+ 'stating a word cap gates past it, on any run except',
116
+ '--citations-only, which never measures it. A record stating no',
117
+ 'cap is reported and never gated. --gate widens the gate to the',
118
+ 'other two findings that are facts rather than judgments: a',
119
+ 'missing required section and index drift. A context entry',
120
+ 'requires Overview and Layout. Entry length, reference form,',
121
+ 'table, and provenance are judgments under both.',
145
122
  '',
146
123
  'Depth and bullet weight are stated over every markdown file rather',
147
124
  'than over a context entry, so `canon markdown audit` measures them.',
@@ -177,7 +154,7 @@ export function register(program: Command): void {
177
154
  .option('--base <ref>', 'Far side of the range, defaulting to the trunk')
178
155
  .option(
179
156
  '--doc-types <list>',
180
- `Comma-separated canonical doc types (default: all five: ${CANONICAL_DOC_TYPES.join(', ')})`,
157
+ `Comma-separated canonical doc types (default: all three: ${CANONICAL_DOC_TYPES.join(', ')})`,
181
158
  )
182
159
  .option(
183
160
  '--backend <name>',
@@ -201,7 +178,7 @@ export function register(program: Command): void {
201
178
  'Examples:',
202
179
  ' canon context classify diff',
203
180
  ' canon context classify diff --base origin/main --json',
204
- ' canon context classify diff --doc-types context,wireframes',
181
+ ' canon context classify diff --doc-types context',
205
182
  '',
206
183
  ].join('\n'),
207
184
  )
@@ -212,13 +189,13 @@ export function register(program: Command): void {
212
189
  classify
213
190
  .command('sweep')
214
191
  .description(
215
- 'Classify every section of the five canonical doc types, split at H3',
192
+ 'Classify every section of the three canonical doc types, split at H3',
216
193
  )
217
194
  .argument('[path]', 'Project root, defaulting to the current directory')
218
195
  .helpOption('-h, --help', 'Show this help message')
219
196
  .option(
220
197
  '--doc-types <list>',
221
- `Comma-separated canonical doc types (default: all five: ${CANONICAL_DOC_TYPES.join(', ')})`,
198
+ `Comma-separated canonical doc types (default: all three: ${CANONICAL_DOC_TYPES.join(', ')})`,
222
199
  )
223
200
  .option(
224
201
  '--backend <name>',
@@ -612,7 +589,7 @@ async function runAudit(
612
589
  return refuse('bad-folder-list', names, gateOnly, root, opts.json ?? false)
613
590
  }
614
591
 
615
- // The root base is opt-in. A target carrying a root `wireframes/` would
592
+ // The root base is opt-in. A target carrying a root folder of its own would
616
593
  // otherwise be audited against a standard it never adopted, on a bare run
617
594
  // that named nothing.
618
595
  const named = opts.folder !== undefined
@@ -667,17 +644,7 @@ async function runAudit(
667
644
  // Absent under `--citations-only` and null when the project carries no
668
645
  // record. A run that never looked and a project with nothing to look at are
669
646
  // different answers, and one value for both reports the second as the first.
670
- const record = gateOnly ? undefined : await measureArchitecture(root)
671
647
  const requirements = gateOnly ? undefined : await measureRequirements(root)
672
- const wireframes = gateOnly
673
- ? []
674
- : (
675
- await Promise.all(
676
- folders
677
- .filter((folder) => folder.name === 'wireframes')
678
- .map((folder) => measureWireframeFolder(root, folder)),
679
- )
680
- ).flat()
681
648
 
682
649
  if (gateOnly) {
683
650
  reportGate(citations)
@@ -691,9 +658,7 @@ async function runAudit(
691
658
  reportTables(entries)
692
659
  reportProvenance(entries, folders)
693
660
  reportDrift(drift)
694
- reportRecord(record, root)
695
661
  reportRequirements(requirements, root)
696
- reportWireframeStates(wireframes)
697
662
  outro()
698
663
  }
699
664
 
@@ -730,22 +695,15 @@ async function runAudit(
730
695
  // Null says the run opened the project and found no record, which a
731
696
  // target that never wrote one is entitled to. Absent says the run
732
697
  // never looked, which is `--citations-only`.
733
- architecture: gateOnly ? undefined : (record ?? null),
734
- // The same three states for the requirements record.
735
698
  requirements: gateOnly ? undefined : (requirements ?? null),
736
- // Absent under `--citations-only`, for the same reason as above. An
737
- // empty array under the ordinary run says the project carries no
738
- // wireframes folder or no entry carrying a States table, which is a
739
- // fact rather than an unmeasured run.
740
- wireframes: gateOnly ? undefined : wireframes,
741
699
  checkpoints: {
742
700
  lines: LENGTH_CHECKPOINT,
743
701
  renderWidth: RENDER_WIDTH,
744
702
  provenanceFolder: PROVENANCE_FOLDER,
745
703
  requiredSections: REQUIRED_SECTIONS,
746
704
  // Keyed on the audited folder name. The flat key above stays for a
747
- // caller that read it before wireframes owed a section, since turning
748
- // it into this map would break that caller without an error.
705
+ // caller that read it first, since removing it would break that
706
+ // caller without an error.
749
707
  requiredSectionsByFolder: REQUIRED_SECTIONS_BY_FOLDER,
750
708
  },
751
709
  })}\n`,
@@ -754,17 +712,10 @@ async function runAudit(
754
712
 
755
713
  const gating = isGating({
756
714
  unresolvedCitations: citations.unresolved.length,
757
- recordOverLength: record !== undefined && isOverLength(record),
758
- recordOverCount: record !== undefined && isOverCount(record),
759
- recordMissingRevisit:
760
- record !== undefined && missingRevisit(record).length > 0,
761
- recordOverWords: record !== undefined && overWords(record).length > 0,
762
- recordOverRisks: record !== undefined && isOverRisks(record),
763
715
  requirementsOverWords:
764
716
  requirements !== undefined && isOverWordCap(requirements),
765
717
  sections,
766
718
  drift,
767
- wireframes,
768
719
  widened,
769
720
  })
770
721
 
@@ -945,8 +896,7 @@ function reportReferenceForm(
945
896
 
946
897
  /**
947
898
  * Names the path each finding belongs to, which is an entry in the folder named
948
- * under `.claude/`, the folder itself in a domain split across one, and the
949
- * file in any wireframe folder. States
899
+ * under `.claude/`, and the folder itself in a domain split across one. States
950
900
  * the reach on every run for the reason the provenance report does.
951
901
  *
952
902
  * This prints ahead of the four readability measures because a missing section
@@ -983,7 +933,7 @@ function reportSections(
983
933
  )
984
934
  }
985
935
  logInfo(
986
- 'A heading at any level counts. Each entry answers for itself, except in a context domain split across a folder, where a sibling answers for the rest. A wireframe answers for itself in every folder.',
936
+ 'A heading at any level counts. Each entry answers for itself, except in a context domain split across a folder, where a sibling answers for the rest.',
987
937
  )
988
938
 
989
939
  if (missing.length === 0) {
@@ -1136,178 +1086,6 @@ function reportProvenance(
1136
1086
  )
1137
1087
  }
1138
1088
 
1139
- /** How each classification reads in the report. */
1140
- const CLAIM_LABEL: Record<string, string> = {
1141
- countable: 'countable claim',
1142
- invariant: 'structural invariant',
1143
- neither: 'reasoning only',
1144
- }
1145
-
1146
- /**
1147
- * Reports the architecture record against the ceiling it states for itself and
1148
- * against what a machine could test in it.
1149
- *
1150
- * The length reading is a fact and gates. Everything below it names candidates
1151
- * a reader adjudicates, because deciding whether a sentence states a claim is a
1152
- * judgment no parser settles, and a stored verdict would age the way the
1153
- * anchors it sits beside already do. Nothing is stored: every run reclassifies,
1154
- * so an entry rewritten tomorrow is read as it stands then.
1155
- */
1156
- function reportRecord(
1157
- report: ArchitectureReport | undefined,
1158
- root: string,
1159
- ): void {
1160
- logStep('Architecture record')
1161
-
1162
- if (report === undefined) {
1163
- logInfo(
1164
- `Out of scope. The project carries no ${architectureRel(root)}, so there was no record to measure.`,
1165
- )
1166
- return
1167
- }
1168
-
1169
- const decisions = report.decisions.length
1170
- const { allowances } = report
1171
-
1172
- logInfo(
1173
- `${plural(report.words, 'word')} across ${plural(report.lines, 'line')}. The whole file's count never gates.`,
1174
- )
1175
- if (report.risksWords !== undefined) {
1176
- logInfo(
1177
- `\`## Risks / open questions\` holds ${plural(report.risksWords, 'word')}.`,
1178
- )
1179
- }
1180
-
1181
- const longDecisions = overWords(report)
1182
- if (report.wordCap === undefined) {
1183
- logInfo(
1184
- 'No word cap a decision stated, so each decision word count is reported and never gated.',
1185
- )
1186
- } else if (longDecisions.length > 0) {
1187
- for (const entry of longDecisions) {
1188
- logError(
1189
- `"${entry.heading}" holds ${entry.words} words against a cap of ${report.wordCap} a decision.`,
1190
- )
1191
- }
1192
- } else {
1193
- logInfo(
1194
- `Every decision fits the cap of ${report.wordCap} words a decision.`,
1195
- )
1196
- }
1197
-
1198
- if (report.riskCap === undefined) {
1199
- logInfo('No risk bullet cap stated, so the Risks section is never gated.')
1200
- } else if (report.risksBullets === undefined) {
1201
- logWarn(
1202
- `The record states a cap of ${report.riskCap} risk bullets and carries no \`## Risks / open questions\` section to count.`,
1203
- )
1204
- } else if (isOverRisks(report)) {
1205
- logError(
1206
- `${plural(report.risksBullets, 'risk bullet')} against a cap of ${report.riskCap}, nested bullets counted.`,
1207
- )
1208
- } else {
1209
- logInfo(
1210
- `${plural(report.risksBullets, 'risk bullet')} against a cap of ${report.riskCap}, nested bullets counted.`,
1211
- )
1212
- }
1213
-
1214
- if (allowances === undefined) {
1215
- logInfo(
1216
- `Covers ${report.rel} alone. No standard sets a length rule for it and this record states none, so its ${plural(report.lines, 'line')} across ${plural(decisions, 'decision')} are reported and nothing is gated.`,
1217
- )
1218
- logInfo(
1219
- 'A record declaring an allowance for its frame and one a decision is measured against the ceiling those two derive. That rule belongs to whichever record writes it, never to the toolkit.',
1220
- )
1221
- } else {
1222
- logInfo(
1223
- `Covers ${report.rel} alone, which states its own allowance of ${plural(allowances.frame, 'line')} for the frame and ${allowances.perDecision} a decision.`,
1224
- )
1225
- if (isOverLength(report)) {
1226
- logError(
1227
- `${report.lines} lines against a ceiling of ${report.ceiling} from ${plural(decisions, 'decision')}`,
1228
- )
1229
- } else {
1230
- logInfo(
1231
- `${report.lines} lines against a ceiling of ${report.ceiling} from ${plural(decisions, 'decision')}.`,
1232
- )
1233
- }
1234
- logInfo(
1235
- `The ceiling rises with the decision count, so adding a decision buys ${allowances.perDecision} lines and the check passes exactly when the file grew.`,
1236
- )
1237
- }
1238
-
1239
- if (report.entryCap === undefined) {
1240
- logInfo(
1241
- `${plural(decisions, 'decision')} and no entry cap stated, so the count is reported and never gated.`,
1242
- )
1243
- } else if (isOverCount(report)) {
1244
- logError(
1245
- `${plural(decisions, 'decision')} against a cap of ${report.entryCap}. Merge two or retire one, never compress.`,
1246
- )
1247
- } else {
1248
- logInfo(
1249
- `${plural(decisions, 'decision')} against a cap of ${report.entryCap}.`,
1250
- )
1251
- }
1252
-
1253
- const revisited = report.decisions.filter((entry) => entry.revisit).length
1254
- const lackingRevisit = missingRevisit(report)
1255
- if (!report.revisitRequired) {
1256
- logInfo(
1257
- `${revisited} of ${plural(decisions, 'decision')} close with a revisit sentence, and the record states no revisit clause, so this is reported and never gated.`,
1258
- )
1259
- } else if (lackingRevisit.length > 0) {
1260
- for (const heading of lackingRevisit) {
1261
- logError(
1262
- `"${heading}" carries no sentence opening "Revisit when", which the record requires of every decision.`,
1263
- )
1264
- }
1265
- } else {
1266
- logInfo(
1267
- `Every one of ${plural(decisions, 'decision')} closes with the revisit sentence the record requires.`,
1268
- )
1269
- }
1270
-
1271
- if (decisions === 0) {
1272
- logWarn('The record declares no decision, so nothing was classified.')
1273
- return
1274
- }
1275
-
1276
- const testable = testableCount(report)
1277
- const covered = coveredCount(report)
1278
-
1279
- logInfo(
1280
- 'A countable claim carries a figure a run could recompute and an invariant quantifies over a named tree a walk could falsify. Both are candidates a reader settles, and neither gates.',
1281
- )
1282
- logInfo(
1283
- 'A figure spelled in words reads as uncounted, since a cardinal in prose is pronominal more often than measured. Entries are counted by heading, so a heading carrying several decisions counts once and the total reads low by however many it holds.',
1284
- )
1285
- const line = `${testable} of ${decisions} carry a claim a machine could test, ${covered} of which name a check that exists`
1286
- // A record whose every testable claim names a check has nothing to act on,
1287
- // and so does one carrying no testable claim at all. Warning on both is how
1288
- // a section becomes one nobody reads after the second run.
1289
- if (testable > covered) logWarn(line)
1290
- else logInfo(`${line}.`)
1291
- logInfo(
1292
- 'Coverage reads the entry rather than the tree, so a claim some check happens to cover without the entry naming it reads as unchecked.',
1293
- )
1294
-
1295
- pipeOutput(
1296
- report.decisions
1297
- .map((entry) => {
1298
- const kind = CLAIM_LABEL[entry.claim] ?? entry.claim
1299
- const evidence =
1300
- entry.figures.length > 0 ? ` ${entry.figures.join(' ')}` : ''
1301
- const checks =
1302
- entry.checks.length > 0
1303
- ? `\n checked by ${entry.checks.join(', ')}`
1304
- : ''
1305
- return `${report.rel}:${entry.line} ${kind}${evidence} ${plural(entry.words, 'word')}\n ${entry.heading}${checks}`
1306
- })
1307
- .join('\n'),
1308
- )
1309
- }
1310
-
1311
1089
  /** Reports the requirements record against the word cap it states, if any. */
1312
1090
  function reportRequirements(
1313
1091
  report: RequirementsReport | undefined,
@@ -1353,43 +1131,3 @@ function reportDrift(drift: readonly FolderDrift[]): void {
1353
1131
  logWarn(plural(lines.length, 'disagreement'))
1354
1132
  pipeOutput(lines.join('\n'))
1355
1133
  }
1356
-
1357
- function reportWireframeStates(
1358
- wireframes: readonly WireframeStatesReport[],
1359
- ): void {
1360
- logStep('Wireframe states')
1361
-
1362
- const withRows = wireframes.filter((entry) => entry.rows.length > 0)
1363
- if (withRows.length === 0) {
1364
- logInfo(
1365
- 'No wireframe carries a States table, so nothing was checked against its evidence folders.',
1366
- )
1367
- return
1368
- }
1369
-
1370
- const lines = withRows.flatMap((entry) => [
1371
- ...entry.missingFolders.map(
1372
- (finding) =>
1373
- `${entry.rel}:${finding.line} ${finding.state} no folder at ${finding.path}`,
1374
- ),
1375
- ...entry.unlistedFolders.map(
1376
- (finding) =>
1377
- `${entry.rel} ${finding.root}/${finding.folder} named in no row`,
1378
- ),
1379
- ...(entry.sketchWithEvidence
1380
- ? [
1381
- `${entry.rel}:${entry.sketchLine} a plaintext sketch sits beside evidence that already exists`,
1382
- ]
1383
- : []),
1384
- ])
1385
-
1386
- if (lines.length === 0) {
1387
- logInfo(
1388
- `${plural(withRows.length, 'wireframe')} checked, every state matched one-to-one with its evidence folder.`,
1389
- )
1390
- return
1391
- }
1392
-
1393
- logWarn(plural(lines.length, 'finding'))
1394
- pipeOutput(lines.join('\n'))
1395
- }