@journeykit/canon 0.26.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/dist/skills/SKILL.src.md +245 -89
  2. package/dist/skills/reference/brief-align.md +4 -2
  3. package/dist/skills/reference/brief-clarify.md +7 -5
  4. package/dist/skills/reference/brief-harden.md +4 -2
  5. package/dist/skills/reference/brief-polish.md +7 -5
  6. package/dist/skills/reference/brief-shape.md +4 -2
  7. package/dist/skills/reference/canon-artifact-ingest.md +11 -7
  8. package/dist/skills/reference/canon-authoring.md +16 -2
  9. package/dist/skills/reference/canon-context.md +21 -11
  10. package/dist/skills/reference/canon-fmt.md +10 -2
  11. package/dist/skills/reference/canon-gate.md +119 -83
  12. package/dist/skills/reference/canon-inventory.md +34 -22
  13. package/dist/skills/reference/canon-learn.md +23 -19
  14. package/dist/skills/reference/canon-plan-import.md +10 -7
  15. package/dist/skills/reference/canon-plugins.md +15 -8
  16. package/dist/skills/reference/canon-policy.md +20 -16
  17. package/dist/skills/reference/canon-report-dashboard.md +30 -19
  18. package/dist/skills/reference/canon-retrieve.md +13 -10
  19. package/dist/skills/reference/canon-review.md +96 -68
  20. package/dist/skills/reference/canon-session-ingest.md +7 -3
  21. package/dist/skills/reference/canon-storage.md +82 -51
  22. package/dist/skills/reference/canon-subject.md +123 -84
  23. package/dist/skills/reference/canon-vocab.md +1 -1
  24. package/dist/skills/reference/role-implementer.md +295 -64
  25. package/dist/skills/reference/role-orchestrator.md +547 -55
  26. package/dist/skills/reference/role-planner.md +189 -32
  27. package/dist/skills/reference/role-reviewer.md +257 -58
  28. package/dist/skills/scripts/canon-retrieve-pre-dispatch.sh +10 -5
  29. package/man/canon-adapter-authorize.1 +44 -0
  30. package/man/canon-adapter-validate.1 +44 -0
  31. package/man/canon-adapter.1 +46 -0
  32. package/man/canon-artifacts-move.1 +63 -0
  33. package/man/canon-artifacts-store.1 +54 -0
  34. package/man/canon-artifacts-verify.1 +48 -0
  35. package/man/canon-artifacts.1 +45 -0
  36. package/man/canon-brief-approve.1 +62 -0
  37. package/man/canon-brief-check.1 +44 -0
  38. package/man/canon-brief-show.1 +50 -0
  39. package/man/canon-brief.1 +63 -0
  40. package/man/canon-change-new.1 +66 -0
  41. package/man/canon-change.1 +42 -0
  42. package/man/canon-completion.1 +60 -0
  43. package/man/canon-context-pack-add.1 +47 -0
  44. package/man/canon-context-pack-show.1 +44 -0
  45. package/man/canon-context-pack-verify.1 +44 -0
  46. package/man/canon-context-pack.1 +50 -0
  47. package/man/canon-context.1 +44 -0
  48. package/man/canon-dashboard.1 +50 -0
  49. package/man/canon-demo-init.1 +44 -0
  50. package/man/canon-demo-review.1 +44 -0
  51. package/man/canon-demo.1 +47 -0
  52. package/man/canon-dispatch-begin.1 +80 -0
  53. package/man/canon-dispatch-diff.1 +41 -0
  54. package/man/canon-dispatch-end.1 +60 -0
  55. package/man/canon-dispatch.1 +45 -0
  56. package/man/canon-divergence-accept.1 +68 -0
  57. package/man/canon-divergence-add.1 +97 -0
  58. package/man/canon-divergence-defer.1 +71 -0
  59. package/man/canon-divergence-list.1 +56 -0
  60. package/man/canon-divergence-resolve.1 +68 -0
  61. package/man/canon-divergence.1 +51 -0
  62. package/man/canon-evidence-add.1 +168 -0
  63. package/man/canon-evidence-approval-payload.1 +65 -0
  64. package/man/canon-evidence-audit.1 +121 -0
  65. package/man/canon-evidence.1 +57 -0
  66. package/man/canon-export.1 +108 -0
  67. package/man/canon-feature-new.1 +62 -0
  68. package/man/canon-feature.1 +39 -0
  69. package/man/canon-finding-add.1 +196 -0
  70. package/man/canon-finding-close.1 +117 -0
  71. package/man/canon-finding-list.1 +59 -0
  72. package/man/canon-finding.1 +67 -0
  73. package/man/canon-format.1 +49 -0
  74. package/man/canon-gate-check.1 +44 -0
  75. package/man/canon-gate-install-hooks.1 +59 -0
  76. package/man/canon-gate-promote.1 +62 -0
  77. package/man/canon-gate.1 +50 -0
  78. package/man/canon-ingest-plans.1 +53 -0
  79. package/man/canon-ingest-records.1 +56 -0
  80. package/man/canon-ingest-sessions.1 +62 -0
  81. package/man/canon-ingest.1 +50 -0
  82. package/man/canon-init.1 +98 -0
  83. package/man/canon-inventory-sync.1 +50 -0
  84. package/man/canon-inventory.1 +39 -0
  85. package/man/canon-ledger-compact.1 +50 -0
  86. package/man/canon-ledger.1 +54 -0
  87. package/man/canon-migrate.1 +89 -0
  88. package/man/canon-plugin-sync.1 +53 -0
  89. package/man/canon-plugin.1 +39 -0
  90. package/man/canon-policy-approve.1 +50 -0
  91. package/man/canon-policy-show.1 +41 -0
  92. package/man/canon-policy.1 +52 -0
  93. package/man/canon-prompt-add.1 +47 -0
  94. package/man/canon-prompt-show.1 +41 -0
  95. package/man/canon-prompt.1 +43 -0
  96. package/man/canon-purge.1 +70 -0
  97. package/man/canon-query.1 +111 -0
  98. package/man/canon-regime-show.1 +50 -0
  99. package/man/canon-regime.1 +39 -0
  100. package/man/canon-report-build.1 +44 -0
  101. package/man/canon-report-check.1 +41 -0
  102. package/man/canon-report-snapshot.1 +47 -0
  103. package/man/canon-report.1 +45 -0
  104. package/man/canon-retrieve.1 +56 -0
  105. package/man/canon-review-change.1 +98 -0
  106. package/man/canon-review-scenario.1 +98 -0
  107. package/man/canon-review.1 +42 -0
  108. package/man/canon-scenario-new.1 +80 -0
  109. package/man/canon-scenario.1 +39 -0
  110. package/man/canon-schema.1 +63 -0
  111. package/man/canon-selftest.1 +69 -0
  112. package/man/canon-skills-check.1 +47 -0
  113. package/man/canon-skills-doctor.1 +47 -0
  114. package/man/canon-skills-install.1 +53 -0
  115. package/man/canon-skills-show.1 +104 -0
  116. package/man/canon-skills.1 +48 -0
  117. package/man/canon-status.1 +51 -0
  118. package/man/canon-strategy-approval-payload.1 +53 -0
  119. package/man/canon-strategy-promote.1 +59 -0
  120. package/man/canon-strategy-rollback.1 +62 -0
  121. package/man/canon-strategy.1 +45 -0
  122. package/man/canon-subject-adopt.1 +53 -0
  123. package/man/canon-subject-move.1 +80 -0
  124. package/man/canon-subject-new.1 +65 -0
  125. package/man/canon-subject-show.1 +44 -0
  126. package/man/canon-subject-unadopt.1 +63 -0
  127. package/man/canon-subject.1 +51 -0
  128. package/man/canon-task-done.1 +47 -0
  129. package/man/canon-task.1 +42 -0
  130. package/man/canon-tier-age.1 +50 -0
  131. package/man/canon-tier.1 +39 -0
  132. package/man/canon.1 +169 -0
  133. package/package.json +9 -5
@@ -0,0 +1,108 @@
1
+ .ie \n(.g .ds Aq \(aq
2
+ .el .ds Aq '
3
+ .TH canon-export 1 "export 0.28.0"
4
+ .SH NAME
5
+ canon\-export \- Export a redacted retention manifest without deleting records
6
+ .SH SYNOPSIS
7
+ \fBcanon export\fR [\fB\-\-as\fR] <\fB\-\-kind\fR> [\fB\-\-before\fR] [\fB\-\-after\fR] [\fB\-o\fR|\fB\-\-output\fR] [\fB\-\-repo\fR] [\fB\-\-json\fR] [\fB\-\-include\-sensitive\fR] [\fB\-\-limit\fR] [\fB\-\-cursor\fR] [\fB\-\-all\fR] [\fB\-\-fields\fR] [\fB\-\-dry\-run\fR] [\fB\-\-input\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR]
8
+ .SH DESCRIPTION
9
+ Export a redacted retention manifest without deleting records
10
+ .SH OPTIONS
11
+ .TP
12
+ \fB\-\-as\fR \fI<ROLE>\fR
13
+ The role you act as: planner, implementer, reviewer or orchestrator. Overrides `CANON_ROLE`. `schema` and `context` list only the role\*(Aqs commands, `status` keeps its steps, and `\-\-role` on `evidence add` / `evidence audit` / `review scenario` / `review change` defaults to it
14
+ .br
15
+
16
+ .br
17
+ \fIPossible values:\fR
18
+ .RS 14
19
+ .IP \(bu 2
20
+ planner
21
+ .IP \(bu 2
22
+ implementer
23
+ .IP \(bu 2
24
+ reviewer
25
+ .IP \(bu 2
26
+ orchestrator
27
+ .RE
28
+ .TP
29
+ \fB\-\-kind\fR \fI<KIND>\fR
30
+ The record kind to export
31
+ .br
32
+
33
+ .br
34
+ \fIPossible values:\fR
35
+ .RS 14
36
+ .IP \(bu 2
37
+ change
38
+ .IP \(bu 2
39
+ task
40
+ .IP \(bu 2
41
+ scenario
42
+ .IP \(bu 2
43
+ session
44
+ .IP \(bu 2
45
+ run
46
+ .IP \(bu 2
47
+ event
48
+ .IP \(bu 2
49
+ handoff
50
+ .IP \(bu 2
51
+ review
52
+ .IP \(bu 2
53
+ divergence
54
+ .IP \(bu 2
55
+ trajectory
56
+ .IP \(bu 2
57
+ strategy_item
58
+ .IP \(bu 2
59
+ evidence
60
+ .IP \(bu 2
61
+ subject
62
+ .IP \(bu 2
63
+ finding
64
+ .RE
65
+ .TP
66
+ \fB\-\-before\fR \fI<TIMESTAMP>\fR
67
+ Only records strictly before this time (RFC3339 or YYYY\-MM\-DD, UTC)
68
+ .TP
69
+ \fB\-\-after\fR \fI<TIMESTAMP>\fR
70
+ Only records at or after this time (RFC3339 or YYYY\-MM\-DD, UTC)
71
+ .TP
72
+ \fB\-o\fR, \fB\-\-output\fR \fI<FILE>\fR
73
+ Write the manifest to this file (mode 0600) instead of stdout
74
+ .TP
75
+ \fB\-\-repo\fR \fI<DIR>\fR
76
+ The repo to act on (default: the nearest ancestor directory holding a canon.yaml)
77
+ .TP
78
+ \fB\-\-json\fR
79
+ Output JSON instead of the human\-readable form
80
+ .TP
81
+ \fB\-\-include\-sensitive\fR
82
+ Include records marked sensitive (only when policy explicitly allows it)
83
+ .TP
84
+ \fB\-\-limit\fR \fI<N>\fR
85
+ Return at most this many records (default 100)
86
+ .TP
87
+ \fB\-\-cursor\fR \fI<CURSOR>\fR
88
+ Resume after the last record of the previous page (the `nextCursor` it reported)
89
+ .TP
90
+ \fB\-\-all\fR
91
+ Return every record from the cursor on, not one page
92
+ .TP
93
+ \fB\-\-fields\fR \fI<FIELDS>\fR
94
+ Keep only these fields of each exported record (comma\-separated): kind, at, id, digest; an unknown field is refused (camelCase and snake_case both match)
95
+ .TP
96
+ \fB\-\-dry\-run\fR
97
+ Validate fully and report what would be written, without writing anything
98
+ .TP
99
+ \fB\-\-input\fR \fI<JSON|FILE|\->\fR
100
+ The arguments as JSON: an object (one run) or an array / NDJSON file or `\-` (a batch); keys are the option names in camelCase, `operands` an array
101
+ .TP
102
+ \fB\-h\fR, \fB\-\-help\fR
103
+ Print help
104
+ .TP
105
+ \fB\-V\fR, \fB\-\-version\fR
106
+ Print version
107
+ .SH VERSION
108
+ v0.28.0
@@ -0,0 +1,62 @@
1
+ .ie \n(.g .ds Aq \(aq
2
+ .el .ds Aq '
3
+ .TH canon-feature-new 1 "new 0.28.0"
4
+ .SH NAME
5
+ canon\-feature\-new \- Create a fresh .feature file for a new area.surface
6
+ .SH SYNOPSIS
7
+ \fBcanon feature new\fR [\fB\-\-as\fR] <\fB\-\-title\fR> [\fB\-\-actor\-id\fR] [\fB\-\-session\-id\fR] [\fB\-\-project\-id\fR] [\fB\-\-repo\fR] [\fB\-\-json\fR] [\fB\-\-input\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] <\fISURFACE\fR>
8
+ .SH DESCRIPTION
9
+ Create a fresh .feature file for a new area.surface
10
+ .SH OPTIONS
11
+ .TP
12
+ \fB\-\-as\fR \fI<ROLE>\fR
13
+ The role you act as: planner, implementer, reviewer or orchestrator. Overrides `CANON_ROLE`. `schema` and `context` list only the role\*(Aqs commands, `status` keeps its steps, and `\-\-role` on `evidence add` / `evidence audit` / `review scenario` / `review change` defaults to it
14
+ .br
15
+
16
+ .br
17
+ \fIPossible values:\fR
18
+ .RS 14
19
+ .IP \(bu 2
20
+ planner
21
+ .IP \(bu 2
22
+ implementer
23
+ .IP \(bu 2
24
+ reviewer
25
+ .IP \(bu 2
26
+ orchestrator
27
+ .RE
28
+ .TP
29
+ \fB\-\-title\fR \fI<TEXT>\fR
30
+ The Feature: header label
31
+ .TP
32
+ \fB\-\-actor\-id\fR \fI<ACTOR_ID>\fR [default: canon\-scaffold]
33
+ Agent id written into provenance (env: CANON_ACTOR)
34
+ .RS
35
+ May also be specified with the \fBCANON_ACTOR\fR environment variable.
36
+ .RE
37
+ .TP
38
+ \fB\-\-session\-id\fR \fI<SESSION_ID>\fR
39
+ The acting session (recorded as actor.session_id); optional
40
+ .TP
41
+ \fB\-\-project\-id\fR \fI<PROJECT_ID>\fR
42
+ Which configured `specs.roots[]` entry to write under, by its id. Required only when the repo configures more than one
43
+ .TP
44
+ \fB\-\-repo\fR \fI<DIR>\fR
45
+ The repo to act on (default: the nearest ancestor directory holding a canon.yaml)
46
+ .TP
47
+ \fB\-\-json\fR
48
+ Output JSON instead of the human\-readable form
49
+ .TP
50
+ \fB\-\-input\fR \fI<JSON|FILE|\->\fR
51
+ The arguments as JSON: an object (one run) or an array / NDJSON file or `\-` (a batch); keys are the option names in camelCase, `operands` an array
52
+ .TP
53
+ \fB\-h\fR, \fB\-\-help\fR
54
+ Print help
55
+ .TP
56
+ \fB\-V\fR, \fB\-\-version\fR
57
+ Print version
58
+ .TP
59
+ <\fISURFACE\fR>
60
+ <area>.<surface> the fresh .feature file scaffolds
61
+ .SH VERSION
62
+ v0.28.0
@@ -0,0 +1,39 @@
1
+ .ie \n(.g .ds Aq \(aq
2
+ .el .ds Aq '
3
+ .TH canon-feature 1 "feature 0.28.0"
4
+ .SH NAME
5
+ canon\-feature \- Scaffold a new .feature spec file
6
+ .SH SYNOPSIS
7
+ \fBcanon feature\fR [\fB\-\-as\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] <\fIsubcommands\fR>
8
+ .SH DESCRIPTION
9
+ Scaffold a new .feature spec file
10
+ .SH OPTIONS
11
+ .TP
12
+ \fB\-\-as\fR \fI<ROLE>\fR
13
+ The role you act as: planner, implementer, reviewer or orchestrator. Overrides `CANON_ROLE`. `schema` and `context` list only the role\*(Aqs commands, `status` keeps its steps, and `\-\-role` on `evidence add` / `evidence audit` / `review scenario` / `review change` defaults to it
14
+ .br
15
+
16
+ .br
17
+ \fIPossible values:\fR
18
+ .RS 14
19
+ .IP \(bu 2
20
+ planner
21
+ .IP \(bu 2
22
+ implementer
23
+ .IP \(bu 2
24
+ reviewer
25
+ .IP \(bu 2
26
+ orchestrator
27
+ .RE
28
+ .TP
29
+ \fB\-h\fR, \fB\-\-help\fR
30
+ Print help
31
+ .TP
32
+ \fB\-V\fR, \fB\-\-version\fR
33
+ Print version
34
+ .SH SUBCOMMANDS
35
+ .TP
36
+ canon\-feature\-new(1)
37
+ Create a fresh .feature file for a new area.surface
38
+ .SH VERSION
39
+ v0.28.0
@@ -0,0 +1,196 @@
1
+ .ie \n(.g .ds Aq \(aq
2
+ .el .ds Aq '
3
+ .TH canon-finding-add 1 "add 0.28.0"
4
+ .SH NAME
5
+ canon\-finding\-add \- Record one code\-review finding (promoted in the same run under `write: { promote: auto }` or with \-\-promote; under `write.promote: manual`, commit it with `canon gate promote`)
6
+ .SH SYNOPSIS
7
+ \fBcanon finding add\fR [\fB\-\-as\fR] <\fB\-\-change\-id\fR> <\fB\-\-round\fR> <\fB\-\-seq\fR> <\fB\-\-severity\fR> [\fB\-\-disposition\fR] <\fB\-\-actor\-id\fR> <\fB\-\-summary\fR> [\fB\-\-rev\fR] [\fB\-\-resolution\-rev\fR] [\fB\-\-introduced\-rev\fR] [\fB\-\-file\-ref\fR] [\fB\-\-scenario\-id\fR] [\fB\-\-role\fR] [\fB\-\-session\-id\fR] [\fB\-\-promote\fR] [\fB\-\-no\-promote\fR] [\fB\-\-repo\fR] [\fB\-\-json\fR] [\fB\-\-input\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR]
8
+ .SH DESCRIPTION
9
+ Record one code\-review finding (promoted in the same run under `write: { promote: auto }` or with \-\-promote; under `write.promote: manual`, commit it with `canon gate promote`)
10
+ .SH OPTIONS
11
+ .TP
12
+ \fB\-\-as\fR \fI<ROLE>\fR
13
+ The role you act as: planner, implementer, reviewer or orchestrator. Overrides `CANON_ROLE`. `schema` and `context` list only the role\*(Aqs commands, `status` keeps its steps, and `\-\-role` on `evidence add` / `evidence audit` / `review scenario` / `review change` defaults to it
14
+ .br
15
+
16
+ .br
17
+ \fIPossible values:\fR
18
+ .RS 14
19
+ .IP \(bu 2
20
+ planner
21
+ .IP \(bu 2
22
+ implementer
23
+ .IP \(bu 2
24
+ reviewer
25
+ .IP \(bu 2
26
+ orchestrator
27
+ .RE
28
+ .TP
29
+ \fB\-\-change\-id\fR \fI<CHANGE_ID>\fR
30
+ The change under review (e.g. s43\-findings\-are\-records) — first component of the natural key
31
+ .TP
32
+ \fB\-\-round\fR \fI<N>\fR
33
+ Which review round on this change raised it (1\-based)
34
+ .TP
35
+ \fB\-\-seq\fR \fI<N>\fR
36
+ This finding\*(Aqs index within the round (1\-based). Required, never auto\-assigned; a collision is refused
37
+ .TP
38
+ \fB\-\-severity\fR \fI<SEVERITY>\fR
39
+ blocker / should\-fix / note — the reviewer\*(Aqs own judgement, never a score canon derives
40
+ .br
41
+
42
+ .br
43
+ \fIPossible values:\fR
44
+ .RS 14
45
+ .IP \(bu 2
46
+ blocker
47
+ .IP \(bu 2
48
+ should\-fix
49
+ .IP \(bu 2
50
+ note
51
+ .RE
52
+ .TP
53
+ \fB\-\-disposition\fR \fI<DISPOSITION>\fR [default: open]
54
+ open / fixed / rejected / deferred (fixed records \-\-resolution\-rev, default HEAD, and only fixed may carry one)
55
+ .br
56
+
57
+ .br
58
+ \fIPossible values:\fR
59
+ .RS 14
60
+ .IP \(bu 2
61
+ open
62
+ .IP \(bu 2
63
+ fixed
64
+ .IP \(bu 2
65
+ rejected
66
+ .IP \(bu 2
67
+ deferred
68
+ .RE
69
+ .TP
70
+ \fB\-\-actor\-id\fR \fI<ACTOR_ID>\fR
71
+ The reviewer who raised it, recorded as the finding\*(Aqs reviewer and author (line breaks refused)
72
+ .TP
73
+ \fB\-\-summary\fR \fI<TEXT>\fR
74
+ One line of what the finding IS, in the reviewer\*(Aqs own words. NEVER checked against the code (line breaks refused)
75
+ .TP
76
+ \fB\-\-rev\fR \fI<REV>\fR [default: HEAD]
77
+ The commit this record is about: any git revision (`HEAD~1`, a branch, a tag, a short sha); the full sha is recorded with the code tree it saw. The default HEAD records the working tree as it stands (uncommitted code included), and a commit made from it has the same code tree. Outside git, or with no commit, the command refuses (NO_COMMIT)
78
+ .TP
79
+ \fB\-\-resolution\-rev\fR \fI<REV>\fR
80
+ The commit that closed it, any git revision (resolved to the full sha, with the code tree it saw). Permitted only with \-\-disposition fixed, where it defaults to HEAD. Existence only; canon never reads the commit\*(Aqs message or diff
81
+ .TP
82
+ \fB\-\-introduced\-rev\fR \fI<REV>\fR
83
+ The SOURCED introducing commit, any git revision (resolved to the full sha). No default: leave it unset when it is not known, never guess (see \-\-help). Existence only; canon never reads the commit\*(Aqs message or diff
84
+ .TP
85
+ \fB\-\-file\-ref\fR \fI<TEXT>\fR
86
+ Where in the tree, as path/to/file.rs:120\-134 (line breaks refused)
87
+ .TP
88
+ \fB\-\-scenario\-id\fR \fI<SCENARIO_ID>\fR
89
+ A scenario this finding is about (repeatable). After a `fixed` close, fresh evidence for these scenarios alone re\-verifies the fix; with none named, every evidenced scenario of the subject does. Each must be a scenario the index knows; a close inherits the list
90
+ .TP
91
+ \fB\-\-role\fR \fI<ROLE>\fR [default: reviewer]
92
+ Attribution only — unlike `canon evidence add`, no partition key derives from it
93
+ .TP
94
+ \fB\-\-session\-id\fR \fI<SESSION_ID>\fR
95
+ The authoring session (recorded as actor.session_id)
96
+ .TP
97
+ \fB\-\-promote\fR
98
+ Promote the record this run staged, in the same run; records others staged stay staged (the default under canon.yaml `write: { promote: auto }`)
99
+ .TP
100
+ \fB\-\-no\-promote\fR
101
+ Keep this write staged even under canon.yaml `write: { promote: auto }`
102
+ .TP
103
+ \fB\-\-repo\fR \fI<DIR>\fR
104
+ The repo to act on (default: the nearest ancestor directory holding a canon.yaml)
105
+ .TP
106
+ \fB\-\-json\fR
107
+ Output JSON instead of the human\-readable form
108
+ .TP
109
+ \fB\-\-input\fR \fI<JSON|FILE|\->\fR
110
+ The arguments as JSON: an object (one run) or an array / NDJSON file or `\-` (a batch); keys are the option names in camelCase, `operands` an array
111
+ .TP
112
+ \fB\-h\fR, \fB\-\-help\fR
113
+ Print help
114
+ .TP
115
+ \fB\-V\fR, \fB\-\-version\fR
116
+ Print version
117
+ .SH EXTRA
118
+ RECORDED OBSERVATION, NOT PROOF. canon does not verify that the defect
119
+ existed, that it was real, that it was fixed, or that \-\-introduced\-rev names
120
+ the commit that actually caused it. This records that a named reviewer, at a
121
+ stamped time, RAISED this finding against this change.
122
+
123
+ An agent that can run this command can record its own review round, with its
124
+ own severities: the author of a finding and its beneficiary are the same
125
+ party, with no signature and no second party — the same gap `canon evidence
126
+ add` states about attestations.
127
+
128
+ What canon does NOT check:
129
+ \- \-\-summary, against the diff, the code, or the review transcript. The
130
+ record is identical whether the defect was real, misdiagnosed, or invented
131
+ \- \-\-resolution\-rev: resolved to a full commit sha, existence only; the
132
+ commit\*(Aqs message and diff are never read. `\-\-disposition fixed` records
133
+ that someone SAID this commit closed it, not that it did
134
+ \- \-\-introduced\-rev: never verified, and never guessed (below)
135
+ \- \-\-rev: optional, because most rounds review an uncommitted
136
+ working tree. When absent, canon does not infer one
137
+ \- whether a finding is right. canon gates on one all the same: a blocker
138
+ that is still `open`, or `fixed` with no fresh evidence after the fix, is
139
+ an `open\-blocker` violation of `canon gate check` and the ship guard
140
+
141
+ What the record IS good for:
142
+ \- attribution: an append\-only row naming who raised what, in which round,
143
+ against which change, at which severity and disposition. Before this
144
+ command, a review round left nothing at all once its transcript was gone
145
+ \- a DERIVED count that stops being typed from memory. v0.4.0\*(Aqs release note
146
+ hand\-typed its issue counts into a published tag and got them wrong; that
147
+ is why this command exists. No count is quoted here and none is asserted
148
+ in its place \-\- read them off the \*(AqReview rounds\*(Aq panel in
149
+ .canon/REPORT.md or the dashboard, which derive them from these records
150
+
151
+ \-\-introduced\-rev must be SOURCED:
152
+ Set it only when the introducing commit was actually established — someone
153
+ read the diff, or the fixing commit names it. Never from timing, commit
154
+ adjacency, or `git blame`. Leaving it UNSET is the correct record when it is
155
+ not known, not an incomplete one. Unset means UNSOURCED, never \*(Aqno cause\*(Aq; a
156
+ guessed value would inflate the exact number this command exists to make
157
+ trustworthy.
158
+
159
+ What a derived fix\-of\-fix count MEANS, stated here word for word as every
160
+ other surface states it (canon_report::render::FIX_OF_FIX_MEANING) rather
161
+ than paraphrased, because paraphrase is how the previous wording went wrong
162
+ on seven surfaces at once:
163
+
164
+ `fix_of_fix` bounds NOTHING — not from below, not from above: it
165
+ UNDER\-counts, because an unsourced finding is never counted and a fix in
166
+ one change that breaks something first found while reviewing a DIFFERENT
167
+ change is not counted at all; it OVER\-counts, because a `resolution_sha`
168
+ commit may carry work BEYOND the fix and every finding recording that
169
+ commit is counted regardless; and for any individual match the data cannot
170
+ say whether the fix or the other work in that commit introduced the
171
+ defect.
172
+
173
+ Fix\-of\-fix is DERIVED, never recorded: a finding is one when its
174
+ introduced_by equals an EARLIER finding\*(Aqs resolution_sha (lower round/seq in
175
+ the same change). There is no flag for it and there will not be one — a flag
176
+ would relocate the hand\-typing from the release notes into the record.
177
+
178
+ \-\-seq is REQUIRED, never auto\-assigned: two concurrent adds would read the
179
+ same highest seq and both pick the next one, landing two records under one
180
+ finding\*(Aqs identity and inflating the count. An already\-occupied
181
+ (\-\-change\-id, \-\-round, \-\-seq) is refused, naming it.
182
+
183
+ Refused before anything is staged:
184
+ \- \-\-disposition fixed with no \-\-resolution\-rev, and \-\-resolution\-rev with
185
+ any other disposition
186
+ \- a line separator in \-\-summary, \-\-file\-ref or \-\-actor\-id: a
187
+ finding is rendered as ONE row, so a separator appends a second row that
188
+ no record backs
189
+
190
+ The loop:
191
+ canon finding add ... Record a Finding (promoted in the same run under
192
+ `write: { promote: auto }`, which `canon init` writes)
193
+ Under `write.promote: manual` (no `write:` key), run `canon gate promote` to
194
+ commit it.
195
+ .SH VERSION
196
+ v0.28.0
@@ -0,0 +1,117 @@
1
+ .ie \n(.g .ds Aq \(aq
2
+ .el .ds Aq '
3
+ .TH canon-finding-close 1 "close 0.28.0"
4
+ .SH NAME
5
+ canon\-finding\-close \- Move an already\-committed finding\*(Aqs disposition (promoted in the same run under `write: { promote: auto }` or with \-\-promote; under `write.promote: manual`, commit it with `canon gate promote`)
6
+ .SH SYNOPSIS
7
+ \fBcanon finding close\fR [\fB\-\-as\fR] <\fB\-\-round\fR> <\fB\-\-seq\fR> <\fB\-\-disposition\fR> [\fB\-\-resolution\-rev\fR] [\fB\-\-reason\fR] [\fB\-\-actor\-id\fR] [\fB\-\-role\fR] [\fB\-\-session\-id\fR] [\fB\-\-promote\fR] [\fB\-\-no\-promote\fR] [\fB\-\-repo\fR] [\fB\-\-json\fR] [\fB\-\-input\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] <\fICHANGE_ID\fR>
8
+ .SH DESCRIPTION
9
+ Move an already\-committed finding\*(Aqs disposition (promoted in the same run under `write: { promote: auto }` or with \-\-promote; under `write.promote: manual`, commit it with `canon gate promote`)
10
+ .SH OPTIONS
11
+ .TP
12
+ \fB\-\-as\fR \fI<ROLE>\fR
13
+ The role you act as: planner, implementer, reviewer or orchestrator. Overrides `CANON_ROLE`. `schema` and `context` list only the role\*(Aqs commands, `status` keeps its steps, and `\-\-role` on `evidence add` / `evidence audit` / `review scenario` / `review change` defaults to it
14
+ .br
15
+
16
+ .br
17
+ \fIPossible values:\fR
18
+ .RS 14
19
+ .IP \(bu 2
20
+ planner
21
+ .IP \(bu 2
22
+ implementer
23
+ .IP \(bu 2
24
+ reviewer
25
+ .IP \(bu 2
26
+ orchestrator
27
+ .RE
28
+ .TP
29
+ \fB\-\-round\fR \fI<N>\fR
30
+ Which review round raised it (1\-based)
31
+ .TP
32
+ \fB\-\-seq\fR \fI<N>\fR
33
+ The finding\*(Aqs index within the round (1\-based)
34
+ .TP
35
+ \fB\-\-disposition\fR \fI<DISPOSITION>\fR
36
+ Where it lands: fixed / rejected / deferred / open (reopening is a real transition). fixed records \-\-resolution\-rev, default HEAD, and only fixed may carry one
37
+ .br
38
+
39
+ .br
40
+ \fIPossible values:\fR
41
+ .RS 14
42
+ .IP \(bu 2
43
+ open
44
+ .IP \(bu 2
45
+ fixed
46
+ .IP \(bu 2
47
+ rejected
48
+ .IP \(bu 2
49
+ deferred
50
+ .RE
51
+ .TP
52
+ \fB\-\-resolution\-rev\fR \fI<REV>\fR
53
+ The commit that closed it, any git revision (resolved to the full sha, with the code tree it saw). Permitted only with \-\-disposition fixed, where it defaults to HEAD. Existence only; canon never reads the commit\*(Aqs message or diff
54
+ .TP
55
+ \fB\-\-reason\fR \fI<TEXT>\fR
56
+ Why it was closed, one line. Required for rejected and deferred, optional for fixed and open; stored on the closing version and shown by `finding list`
57
+ .TP
58
+ \fB\-\-actor\-id\fR \fI<ACTOR_ID>\fR [default: canon]
59
+ The actor recorded as authoring the TRANSITION — not the original finding\*(Aqs author, which is preserved on the record this supersedes
60
+ .TP
61
+ \fB\-\-role\fR \fI<ROLE>\fR [default: reviewer]
62
+ Attribution only — no partition key derives from it
63
+ .TP
64
+ \fB\-\-session\-id\fR \fI<SESSION_ID>\fR
65
+ The session that authored the TRANSITION (recorded as actor.session_id)
66
+ .TP
67
+ \fB\-\-promote\fR
68
+ Promote the record this run staged, in the same run; records others staged stay staged (the default under canon.yaml `write: { promote: auto }`)
69
+ .TP
70
+ \fB\-\-no\-promote\fR
71
+ Keep this write staged even under canon.yaml `write: { promote: auto }`
72
+ .TP
73
+ \fB\-\-repo\fR \fI<DIR>\fR
74
+ The repo to act on (default: the nearest ancestor directory holding a canon.yaml)
75
+ .TP
76
+ \fB\-\-json\fR
77
+ Output JSON instead of the human\-readable form
78
+ .TP
79
+ \fB\-\-input\fR \fI<JSON|FILE|\->\fR
80
+ The arguments as JSON: an object (one run) or an array / NDJSON file or `\-` (a batch); keys are the option names in camelCase, `operands` an array
81
+ .TP
82
+ \fB\-h\fR, \fB\-\-help\fR
83
+ Print help
84
+ .TP
85
+ \fB\-V\fR, \fB\-\-version\fR
86
+ Print version
87
+ .TP
88
+ <\fICHANGE_ID\fR>
89
+ The change under review — first component of the natural key
90
+ .SH EXTRA
91
+ A finding is raised `open` and later closed. This is the ONLY way to record
92
+ that second state: `canon finding add` refuses an occupied natural key,
93
+ because two DIFFERENT findings under one (change, round, seq) are two
94
+ reviewers\*(Aq work collapsed into one identity.
95
+
96
+ What it changes: the disposition, `resolution_sha` with it, and the closing
97
+ \-\-reason (required for rejected and deferred). NOTHING else.
98
+ Severity, reviewer, summary, \-\-rev, \-\-introduced\-rev and \-\-file\-ref
99
+ are READ from the committed record and copied byte\-identically — this command
100
+ cannot edit them, and no command can. A finding recorded wrongly stays
101
+ wrongly recorded; that is the append\-only ledger working, not a gap.
102
+
103
+ The committed record STAYS. This appends a second version at the same
104
+ natural key, and the pair IS the history: `open` at one instant, `fixed` at
105
+ another, each with its own author and timestamp. Every reader folds by
106
+ natural key to the latest version, so the finding is still counted once.
107
+
108
+ `canon gate promote` re\-derives the transition rule itself before committing
109
+ the second version, so a hand\-written body must clear the same bar.
110
+
111
+ Examples:
112
+ canon finding close \-\-change\-id s44\-spec\-derived\-worklist \-\-round 1 \-\-seq 1 \\
113
+ \-\-disposition fixed \-\-resolution\-rev $(git rev\-parse HEAD)
114
+ canon finding close \-\-change\-id s44\-spec\-derived\-worklist \-\-round 1 \-\-seq 9 \\
115
+ \-\-disposition rejected
116
+ .SH VERSION
117
+ v0.28.0
@@ -0,0 +1,59 @@
1
+ .ie \n(.g .ds Aq \(aq
2
+ .el .ds Aq '
3
+ .TH canon-finding-list 1 "list 0.28.0"
4
+ .SH NAME
5
+ canon\-finding\-list \- List a change\*(Aqs committed findings at their latest version: round, seq, severity, disposition, reviewer and summary
6
+ .SH SYNOPSIS
7
+ \fBcanon finding list\fR [\fB\-\-as\fR] <\fB\-\-change\-id\fR> [\fB\-\-open\fR] [\fB\-\-json\fR] [\fB\-\-repo\fR] [\fB\-\-limit\fR] [\fB\-\-cursor\fR] [\fB\-\-all\fR] [\fB\-\-fields\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR]
8
+ .SH DESCRIPTION
9
+ List a change\*(Aqs committed findings at their latest version: round, seq, severity, disposition, reviewer and summary
10
+ .SH OPTIONS
11
+ .TP
12
+ \fB\-\-as\fR \fI<ROLE>\fR
13
+ The role you act as: planner, implementer, reviewer or orchestrator. Overrides `CANON_ROLE`. `schema` and `context` list only the role\*(Aqs commands, `status` keeps its steps, and `\-\-role` on `evidence add` / `evidence audit` / `review scenario` / `review change` defaults to it
14
+ .br
15
+
16
+ .br
17
+ \fIPossible values:\fR
18
+ .RS 14
19
+ .IP \(bu 2
20
+ planner
21
+ .IP \(bu 2
22
+ implementer
23
+ .IP \(bu 2
24
+ reviewer
25
+ .IP \(bu 2
26
+ orchestrator
27
+ .RE
28
+ .TP
29
+ \fB\-\-change\-id\fR \fI<CHANGE_ID>\fR
30
+ The change whose findings to list
31
+ .TP
32
+ \fB\-\-open\fR
33
+ Only findings whose current disposition is open
34
+ .TP
35
+ \fB\-\-json\fR
36
+ Print `{change_id, findings: [...], meta}` as JSON
37
+ .TP
38
+ \fB\-\-repo\fR \fI<DIR>\fR
39
+ The repo to act on (default: the nearest ancestor directory holding a canon.yaml)
40
+ .TP
41
+ \fB\-\-limit\fR \fI<N>\fR
42
+ Return at most this many records (default 100)
43
+ .TP
44
+ \fB\-\-cursor\fR \fI<CURSOR>\fR
45
+ Resume after the last record of the previous page (the `nextCursor` it reported)
46
+ .TP
47
+ \fB\-\-all\fR
48
+ Return every record from the cursor on, not one page
49
+ .TP
50
+ \fB\-\-fields\fR \fI<FIELDS>\fR
51
+ With \-\-json, keep only these finding fields (comma\-separated): round, seq, severity, disposition, reviewer, summary, resolution_sha, file_ref; camelCase and snake_case both match
52
+ .TP
53
+ \fB\-h\fR, \fB\-\-help\fR
54
+ Print help
55
+ .TP
56
+ \fB\-V\fR, \fB\-\-version\fR
57
+ Print version
58
+ .SH VERSION
59
+ v0.28.0
@@ -0,0 +1,67 @@
1
+ .ie \n(.g .ds Aq \(aq
2
+ .el .ds Aq '
3
+ .TH canon-finding 1 "finding 0.28.0"
4
+ .SH NAME
5
+ canon\-finding \- Record one code\-review finding as a durable record
6
+ .SH SYNOPSIS
7
+ \fBcanon finding\fR [\fB\-\-as\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] <\fIsubcommands\fR>
8
+ .SH DESCRIPTION
9
+ Record one code\-review finding as a durable record
10
+ .SH OPTIONS
11
+ .TP
12
+ \fB\-\-as\fR \fI<ROLE>\fR
13
+ The role you act as: planner, implementer, reviewer or orchestrator. Overrides `CANON_ROLE`. `schema` and `context` list only the role\*(Aqs commands, `status` keeps its steps, and `\-\-role` on `evidence add` / `evidence audit` / `review scenario` / `review change` defaults to it
14
+ .br
15
+
16
+ .br
17
+ \fIPossible values:\fR
18
+ .RS 14
19
+ .IP \(bu 2
20
+ planner
21
+ .IP \(bu 2
22
+ implementer
23
+ .IP \(bu 2
24
+ reviewer
25
+ .IP \(bu 2
26
+ orchestrator
27
+ .RE
28
+ .TP
29
+ \fB\-h\fR, \fB\-\-help\fR
30
+ Print help
31
+ .TP
32
+ \fB\-V\fR, \fB\-\-version\fR
33
+ Print version
34
+ .SH SUBCOMMANDS
35
+ .TP
36
+ canon\-finding\-add(1)
37
+ Record one code\-review finding (promoted in the same run under `write: { promote: auto }` or with \-\-promote; under `write.promote: manual`, commit it with `canon gate promote`)
38
+ .TP
39
+ canon\-finding\-close(1)
40
+ Move an already\-committed finding\*(Aqs disposition (promoted in the same run under `write: { promote: auto }` or with \-\-promote; under `write.promote: manual`, commit it with `canon gate promote`)
41
+ .TP
42
+ canon\-finding\-list(1)
43
+ List a change\*(Aqs committed findings at their latest version: round, seq, severity, disposition, reviewer and summary
44
+ .SH EXTRA
45
+ Examples:
46
+ canon finding add \-\-change\-id s43\-findings\-are\-records \-\-round 1 \-\-seq 1 \\
47
+ \-\-severity blocker \-\-disposition open \-\-actor\-id review\-voice \\
48
+ \-\-summary \*(Aqa release metric is asserted, never computed\*(Aq
49
+ canon finding close s43\-findings\-are\-records \-\-round 1 \-\-seq 1 \\
50
+ \-\-disposition fixed \-\-resolution\-rev $(git rev\-parse HEAD)
51
+
52
+ The loop:
53
+ canon finding add ... Record a Finding
54
+ canon finding close ... Record its disposition TRANSITION, once fixed
55
+ Each is promoted in the same run under `write: { promote: auto }`, which
56
+ `canon init` writes. Under `write.promote: manual` (no `write:` key), run
57
+ `canon gate promote` after each to commit it.
58
+
59
+ The committed finding STAYS when it is closed: the ledger is append\-only and
60
+ the pair IS the history. Every reader folds by natural key to the latest
61
+ version, so the finding is still counted once.
62
+
63
+ RECORDED OBSERVATION, NOT PROOF — canon never verifies that the defect
64
+ existed, that it was fixed, or that \-\-introduced\-rev is the true cause.
65
+ See `canon finding add \-\-help` for exactly what it does and does not establish.
66
+ .SH VERSION
67
+ v0.28.0