@journeykit/canon 0.35.0 → 0.37.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/dist/skills/SKILL.src.md +41 -20
- package/dist/skills/reference/canon-authoring.md +3 -2
- package/dist/skills/reference/canon-gate.md +29 -14
- package/dist/skills/reference/canon-inventory.md +3 -1
- package/dist/skills/reference/canon-learn.md +7 -2
- package/dist/skills/reference/canon-policy.md +3 -3
- package/dist/skills/reference/canon-report-dashboard.md +5 -5
- package/dist/skills/reference/canon-review.md +12 -9
- package/dist/skills/reference/canon-storage.md +4 -4
- package/dist/skills/reference/canon-subject.md +25 -23
- package/dist/skills/reference/role-implementer.md +8 -6
- package/dist/skills/reference/role-orchestrator.md +22 -21
- package/dist/skills/reference/role-planner.md +7 -7
- package/dist/skills/reference/role-reviewer.md +8 -8
- package/man/canon-adapter-authorize.1 +2 -2
- package/man/canon-adapter-validate.1 +2 -2
- package/man/canon-adapter.1 +2 -2
- package/man/canon-artifacts-move.1 +6 -6
- package/man/canon-artifacts-store.1 +2 -2
- package/man/canon-artifacts-verify.1 +2 -2
- package/man/canon-artifacts.1 +2 -2
- package/man/canon-brief-approve.1 +9 -6
- package/man/canon-brief-check.1 +2 -2
- package/man/canon-brief-show.1 +2 -2
- package/man/canon-brief.1 +2 -2
- package/man/canon-change-new.1 +2 -2
- package/man/canon-change.1 +2 -2
- package/man/canon-completion.1 +2 -2
- package/man/canon-context-pack-add.1 +2 -2
- package/man/canon-context-pack-show.1 +2 -2
- package/man/canon-context-pack-verify.1 +2 -2
- package/man/canon-context-pack.1 +2 -2
- package/man/canon-context.1 +2 -2
- package/man/canon-dashboard.1 +2 -2
- package/man/canon-demo-init.1 +2 -2
- package/man/canon-demo-review.1 +2 -2
- package/man/canon-demo.1 +2 -2
- package/man/canon-dispatch-begin.1 +2 -2
- package/man/canon-dispatch-diff.1 +2 -2
- package/man/canon-dispatch-end.1 +2 -2
- package/man/canon-dispatch.1 +2 -2
- package/man/canon-divergence-accept.1 +3 -3
- package/man/canon-divergence-add.1 +4 -4
- package/man/canon-divergence-defer.1 +4 -4
- package/man/canon-divergence-list.1 +3 -3
- package/man/canon-divergence-resolve.1 +3 -3
- package/man/canon-divergence.1 +2 -2
- package/man/canon-evidence-add.1 +9 -9
- package/man/canon-evidence-approval-payload.1 +4 -4
- package/man/canon-evidence-audit.1 +7 -7
- package/man/canon-evidence.1 +2 -2
- package/man/canon-export.1 +4 -4
- package/man/canon-feature-new.1 +2 -2
- package/man/canon-feature.1 +2 -2
- package/man/canon-finding-add.1 +5 -5
- package/man/canon-finding-close.1 +4 -6
- package/man/canon-finding-list.1 +2 -2
- package/man/canon-finding.1 +2 -2
- package/man/canon-format.1 +2 -2
- package/man/canon-gate-check.1 +2 -2
- package/man/canon-gate-install-hooks.1 +2 -2
- package/man/canon-gate-promote.1 +2 -2
- package/man/canon-gate.1 +2 -2
- package/man/canon-ingest-plans.1 +2 -2
- package/man/canon-ingest-records.1 +2 -2
- package/man/canon-ingest-sessions.1 +2 -2
- package/man/canon-ingest.1 +2 -2
- package/man/canon-init.1 +5 -4
- package/man/canon-inventory-sync.1 +2 -2
- package/man/canon-inventory.1 +2 -2
- package/man/canon-ledger-compact.1 +5 -5
- package/man/canon-ledger.1 +3 -3
- package/man/canon-migrate.1 +8 -8
- package/man/canon-plugin-sync.1 +2 -2
- package/man/canon-plugin.1 +2 -2
- package/man/canon-policy-approve.1 +2 -2
- package/man/canon-policy-show.1 +2 -2
- package/man/canon-policy.1 +2 -2
- package/man/canon-prompt-add.1 +2 -2
- package/man/canon-prompt-show.1 +2 -2
- package/man/canon-prompt.1 +2 -2
- package/man/canon-purge.1 +8 -8
- package/man/canon-query.1 +3 -3
- package/man/canon-regime-show.1 +2 -2
- package/man/canon-regime.1 +2 -2
- package/man/canon-report-build.1 +2 -2
- package/man/canon-report-check.1 +2 -2
- package/man/canon-report-snapshot.1 +2 -2
- package/man/canon-report.1 +2 -2
- package/man/canon-retrieve.1 +2 -2
- package/man/canon-review-change.1 +4 -4
- package/man/canon-review-scenario.1 +4 -4
- package/man/canon-review.1 +2 -2
- package/man/canon-scenario-new.1 +2 -2
- package/man/canon-scenario.1 +2 -2
- package/man/canon-schema.1 +10 -4
- package/man/canon-search.1 +2 -2
- package/man/canon-selftest.1 +2 -2
- package/man/canon-skills-check.1 +3 -3
- package/man/canon-skills-doctor.1 +3 -3
- package/man/canon-skills-install.1 +3 -3
- package/man/canon-skills-show.1 +2 -2
- package/man/canon-skills.1 +2 -2
- package/man/canon-status.1 +2 -2
- package/man/canon-strategy-approval-payload.1 +3 -3
- package/man/canon-strategy-promote.1 +2 -2
- package/man/canon-strategy-rollback.1 +3 -3
- package/man/canon-strategy.1 +2 -2
- package/man/canon-subject-adopt.1 +2 -2
- package/man/canon-subject-move.1 +2 -2
- package/man/canon-subject-new.1 +2 -2
- package/man/canon-subject-show.1 +2 -2
- package/man/canon-subject-unadopt.1 +3 -3
- package/man/canon-subject.1 +2 -2
- package/man/canon-task-done.1 +2 -2
- package/man/canon-task.1 +2 -2
- package/man/canon-tier-age.1 +5 -5
- package/man/canon-tier.1 +2 -2
- package/man/canon-trace.1 +2 -2
- package/man/canon.1 +3 -3
- package/package.json +4 -4
|
@@ -71,7 +71,8 @@ canon subject new subject-domain-loop \
|
|
|
71
71
|
subjects at once: `--input` takes inline JSON, a file or `-`; an array (or
|
|
72
72
|
NDJSON) is a batch validated before any write, with `operands` holding the
|
|
73
73
|
id and the other keys the option names in camelCase (`canon schema subject
|
|
74
|
-
new --json` shows `input
|
|
74
|
+
new --json` shows `input`, its limits and a complete `example`; `canon schema subject new --schemas --json`
|
|
75
|
+
gives `Input`, the schema of one document). Writing an identical subject
|
|
75
76
|
again is a no-op reported `unchanged` (`data.unchanged`).
|
|
76
77
|
|
|
77
78
|
### 2. Retrieve subject-scoped strategy memory BEFORE working
|
|
@@ -137,7 +138,7 @@ canon subject move subject-domain-loop --to shipped
|
|
|
137
138
|
|
|
138
139
|
On success the status updates in place; `--json` prints the updated
|
|
139
140
|
record. On a gate block it prints violations by failure class to stderr,
|
|
140
|
-
exits
|
|
141
|
+
exits 2 (the code names the condition: `SUBJECT_APPROVAL_REQUIRED`, `EVIDENCE_STALE`, `LAYOUT_MIGRATION_REQUIRED` or `SUBJECT_INVALID`; several causes are `error.details[]`), and the record is unchanged.
|
|
141
142
|
|
|
142
143
|
**Corpus-wide, the same join:** `canon gate check` with
|
|
143
144
|
`.canon/policy.yaml`'s opt-in `spec_coverage` section generalizes this
|
|
@@ -166,7 +167,7 @@ from shipping, until every evidenced scenario has evidence recorded after
|
|
|
166
167
|
the close or the approval; the refusal names the scenarios and the
|
|
167
168
|
`canon evidence add --all-scenarios` command. Each refusal prints by
|
|
168
169
|
failure class (`uncovered-cell`), carries a `hint`,
|
|
169
|
-
exits
|
|
170
|
+
exits 2, and the status stays `verifying`. `retired` is not gated.
|
|
170
171
|
|
|
171
172
|
**The brief (0.16, 0.17, 0.19):** `verifying → shipped` also refuses where a brief
|
|
172
173
|
exists and is not approved, read exactly as `canon status` reads it (one
|
|
@@ -174,7 +175,7 @@ shared check, so status says `ship` only when this passes): the subject's
|
|
|
174
175
|
scope (every change the subject answers for, see below) has a canon `.canon/changes/<change>/brief.md`
|
|
175
176
|
with no `Approved:` line outside HTML comments and code fences, whose
|
|
176
177
|
`Approved:` line carries a digest the brief's text no longer matches
|
|
177
|
-
(`
|
|
178
|
+
(`BRIEF_APPROVAL_STALE`; the brief was edited after the human
|
|
178
179
|
answered), or has no canon `brief.md` yet but comes from an external
|
|
179
180
|
openspec plan with a `proposal.md` under the plan sources. It also
|
|
180
181
|
refuses while `canon brief check` has blocker findings for that change,
|
|
@@ -184,7 +185,7 @@ a policy. The refusal is an `unreviewed-promotion` naming the subject, and
|
|
|
184
185
|
says what to do:
|
|
185
186
|
|
|
186
187
|
```output
|
|
187
|
-
output: canon subject move:
|
|
188
|
+
output: canon subject move: SUBJECT_INVALID — unreviewed-promotion demo-subject — verifying → shipped: brief not approved — .canon/changes/c-demo/brief.md has no `Approved:` line; a human must answer the brief, and only from that answer the agent will record their words with `canon brief approve c-demo --approver <the human> --note "<their words>"`
|
|
188
189
|
output: canon subject move: refused — get the human's answer to the brief and record it with `canon brief approve`, or pass --override-reason <text> to move anyway; the waiver is recorded on the subject
|
|
189
190
|
```
|
|
190
191
|
|
|
@@ -211,7 +212,7 @@ This refusal is a backstop, and so is the evidence one: shipping is not
|
|
|
211
212
|
the first thing an unapproved brief stops. The agent writes the brief,
|
|
212
213
|
runs `canon brief check` until it has no blockers, then shows it to the
|
|
213
214
|
human and asks, and nothing is built or attested for the subject until the human
|
|
214
|
-
answers. `canon evidence add` refuses (exit
|
|
215
|
+
answers. `canon evidence add` refuses (exit 2, nothing staged) a
|
|
215
216
|
scenario whose `@subject` owner, or a task whose change
|
|
216
217
|
an adopting subject, has an enforced, unapproved brief, through the same
|
|
217
218
|
check; see `canon-gate`.
|
|
@@ -223,7 +224,7 @@ check; see `canon-gate`.
|
|
|
223
224
|
edited since, and even if the tags were removed; or (3) a *chore*, which has
|
|
224
225
|
no scenario to tag and so governs from the moment it is adopted. They pass
|
|
225
226
|
only when every one of them reads as approved now; an unapproved one and one
|
|
226
|
-
edited after its approval (`
|
|
227
|
+
edited after its approval (`BRIEF_APPROVAL_STALE`) are named for
|
|
227
228
|
different reasons, and the answer does not depend on the order the changes
|
|
228
229
|
were adopted or approved. The ship guard's brief-structure check runs over
|
|
229
230
|
all of them. When several block, the hint is one
|
|
@@ -245,7 +246,7 @@ answers only to the changes its tags name (counting only changes the subject
|
|
|
245
246
|
adopted); another change's edit after its approval never blocks it. An untagged
|
|
246
247
|
scenario (one whose tags were removed reads the same) answers to every adopted
|
|
247
248
|
change with an `Approved:` line, a chore included, so an approved change edited
|
|
248
|
-
since refuses it (`
|
|
249
|
+
since refuses it (`BRIEF_APPROVAL_STALE`); an unapproved chore blocks
|
|
249
250
|
reopen and ship, never evidence. When no adopted change has an approved line,
|
|
250
251
|
a scenario with evidence recorded before the subject first adopted a change
|
|
251
252
|
(and without a brief override) needs no brief, and one without answers to the
|
|
@@ -270,7 +271,7 @@ A target outside `require_review.scope` prints `skipped
|
|
|
270
271
|
unreviewed-promotion — `specced` is not in require_review.scope`. A
|
|
271
272
|
transition INTO an in-scope status with gaps — an owned scenario with no
|
|
272
273
|
qualifying review (`unreviewed-promotion`), or an open blocker finding
|
|
273
|
-
on an adopted change (`open-blocker`) — prints the violations, exits
|
|
274
|
+
on an adopted change (`open-blocker`) — prints the violations, exits 2,
|
|
274
275
|
leaves the record unchanged, and names `--override-reason`. `shipped`
|
|
275
276
|
also refuses a `false-success` (a scenario whose latest audit is
|
|
276
277
|
`refuted`) and, when `require_audit.scope` covers `shipped`, an owed
|
|
@@ -332,14 +333,14 @@ output: canon subject move: demo-subject → verifying — written directly; not
|
|
|
332
333
|
- Inside the approved scope it needs no human: every change the subject
|
|
333
334
|
answers for (tagged, approved or chore) has an approved brief, or there
|
|
334
335
|
is no brief to answer.
|
|
335
|
-
Otherwise it refuses, exit
|
|
336
|
+
Otherwise it refuses, exit 2, naming the brief to approve, and
|
|
336
337
|
`--override-reason` does not waive it:
|
|
337
338
|
``unreviewed-promotion demo-subject — shipped → verifying: reopening needs the approved scope, and the brief is not approved — .canon/changes/c-next/brief.md has no `Approved:` line; …``.
|
|
338
339
|
- The review guard does not run on a reopen (it prints `skipped … — a
|
|
339
340
|
reopen moves the subject back to fix its gaps; shipping again runs
|
|
340
341
|
it`). `verifying → shipped` afterwards runs every guard above again.
|
|
341
|
-
- A policy that fails closed (`
|
|
342
|
-
`
|
|
342
|
+
- A policy that fails closed (`POLICY_APPROVAL_STALE`,
|
|
343
|
+
`POLICY_APPROVAL_CORRUPT`, `POLICY_APPROVAL_DENIED`: see `canon-policy`) refuses the reopen and
|
|
343
344
|
the ship, and `--override-reason` does not waive it.
|
|
344
345
|
- `canon change new` on a shipped subject prints the reopen command
|
|
345
346
|
(`canon subject move <id> --to verifying --reason "<why it reopens>"`)
|
|
@@ -422,7 +423,7 @@ canon subject unadopt <S> --change <change> --json
|
|
|
422
423
|
|
|
423
424
|
Removes the link on both records and keeps the change and its brief, so the
|
|
424
425
|
draft can be adopted elsewhere (a `proposed` holding subject, say) while the
|
|
425
|
-
live subject keeps shipping. It is refused with `
|
|
426
|
+
live subject keeps shipping. It is refused with `SUBJECT_CONFLICT` (reason `APPROVED_BRIEF` or `FLOW_TAGGED`)
|
|
426
427
|
for a change whose brief carries an `Approved:` line, and while a scenario
|
|
427
428
|
the subject owns carries a `@flow:<change>.*` tag (it would fall back to an
|
|
428
429
|
older approval; remove or retag those scenarios first, the hint names them);
|
|
@@ -509,12 +510,12 @@ same answer and one timestamp on every brief and on the policy approval
|
|
|
509
510
|
(0.31). Every slug is checked before anything is written (a brief that
|
|
510
511
|
exists and reads, no blocker, a one-line name and answer, a body that does not
|
|
511
512
|
end inside an open code fence); one refused slug refuses the call, exit 2
|
|
512
|
-
|
|
513
|
-
nothing is written. A repeated slug counts once. With one slug the output is as
|
|
513
|
+
with the first refused slug's own code (`BRIEF_INVALID`, `BRIEF_NOT_FOUND`) and an
|
|
514
|
+
`error.details` entry for each refused slug, and nothing is written. A repeated slug counts once. With one slug the output is as
|
|
514
515
|
before; with several, `--json` carries one entry per slug (`written`,
|
|
515
516
|
`unchanged`, `failed`, `skipped`). A disk error while writing exits 1 and
|
|
516
517
|
leaves the slugs already written approved. The call is human-only for every
|
|
517
|
-
slug; the `
|
|
518
|
+
slug; the `ACTOR_DENIED` hint gives the human one line with all the slugs.
|
|
518
519
|
|
|
519
520
|
Without the change operand, the repo's only live change is read. The brief is the
|
|
520
521
|
PRD `canon change new` writes; sections are found by their English `##`
|
|
@@ -524,7 +525,7 @@ before. A brief with `<!-- canon:… -->` comments or Korean headings is in the
|
|
|
524
525
|
0.30 format: `brief check` gives it one blocker (`brief.old-format`) and
|
|
525
526
|
`canon migrate` rewrites it; `status`, `gate check`, `context` and `brief show`
|
|
526
527
|
warn, and a command that writes and judges it is refused
|
|
527
|
-
(`
|
|
528
|
+
(`BRIEF_MIGRATION_REQUIRED`).
|
|
528
529
|
|
|
529
530
|
- **Blockers (structure, `brief.*`)**: a missing, duplicated or
|
|
530
531
|
out-of-order section; a flow with no steps or a duplicate step id;
|
|
@@ -546,10 +547,11 @@ warn, and a command that writes and judges it is refused
|
|
|
546
547
|
`reason`), one rule in one section, reason required; add `match` to waive
|
|
547
548
|
only the findings whose matched text contains it. Listed in the output.
|
|
548
549
|
- **`approve`** records the human's answer: it writes
|
|
549
|
-
`Approved: <who> <when> — "<words>" (brief sha256:<digest>)`
|
|
550
|
-
|
|
550
|
+
`Approved: <who> <when> — "<words>" (code tree <id>) (brief sha256:<digest>)`
|
|
551
|
+
into the brief (the code tree, 0.37, is the work tree's as it is now and is
|
|
552
|
+
left out outside git or with no commit) and records the policy approval in the same call. It refuses
|
|
551
553
|
(exit 2) while the check has structure blockers. Edit the brief
|
|
552
|
-
afterwards and every reader says `
|
|
554
|
+
afterwards and every reader says `BRIEF_APPROVAL_STALE` until a
|
|
553
555
|
human answers again and `approve` runs again. Run it only from the
|
|
554
556
|
human's answer, with their words as `--note`.
|
|
555
557
|
|
|
@@ -616,10 +618,10 @@ uses, so status and the gate cannot disagree about a gap:
|
|
|
616
618
|
something after it, and sits outside HTML comments (`<!-- … -->`,
|
|
617
619
|
multi-line included) and fenced code blocks (```` ``` ```` or `~~~`).
|
|
618
620
|
`canon brief approve` writes it from the human's answer, as
|
|
619
|
-
`Approved: <who> <when> — "<the human's words>" (brief sha256:<digest>)`,
|
|
620
|
-
the digest covering the brief without its `Approved:` lines. A brief
|
|
621
|
+
`Approved: <who> <when> — "<the human's words>" (code tree <id>) (brief sha256:<digest>)`,
|
|
622
|
+
the digest covering the brief without its `Approved:` lines (the tree marker is outside it; a line without one is read as before). A brief
|
|
621
623
|
edited after that reads `brief: not approved (<brief> changed after its
|
|
622
|
-
approval (
|
|
624
|
+
approval (BRIEF_APPROVAL_STALE))` and names the re-approval
|
|
623
625
|
command: the changed brief needs a new human answer. A line with no
|
|
624
626
|
digest (written before 0.19) stays approved, with an `advisory:` to
|
|
625
627
|
re-approve so it binds to the text. Fixes and follow-ups
|
|
@@ -10,7 +10,7 @@ build nothing meanwhile. The only waiver is `--override-reason
|
|
|
10
10
|
the human's answer: canon records it on the evidence, echoes it in
|
|
11
11
|
`data.overrides[]` and lists it in `status` for the human. Never use it to
|
|
12
12
|
skip the wait yourself. `brief approve`, `policy approve` and `divergence
|
|
13
|
-
accept` are the human's; they refuse you (`
|
|
13
|
+
accept` are the human's; they refuse you (`ACTOR_DENIED`) unless they record an
|
|
14
14
|
answer the human gave in the conversation (`--relayed-via`, the planner's
|
|
15
15
|
procedure: `canon skills show role-planner`). You never run them without that
|
|
16
16
|
answer, and never remove or unset your role (`env -u CANON_ROLE`, dropping
|
|
@@ -25,7 +25,7 @@ in your ids. Use only the options on a line; never guess one. Ask `canon schema
|
|
|
25
25
|
<command> --json` only for a leaf this block does not list, or after a `USAGE` refusal.
|
|
26
26
|
|
|
27
27
|
<!-- canon:generated commands-implementer begin -->
|
|
28
|
-
Every leaf takes `--as <ROLE>` and `--json`; `--repo <DIR>` too, except `completion`, `schema`, `skills show`. `--input <JSON|FILE|->` runs a leaf from one JSON document (an array is a batch) and is only on the lines ending `[--input]`. Its document keys are the option names in camelCase, singular even when the option repeats (the value is then an array), and `operands` holds the operands. `--fields <FIELDS>` is a comma list of the paths `canon schema <COMMAND> --json` declares under `outputs[].fields.paths`; a path is the record's own key, spelled as the answer spells it.
|
|
28
|
+
Every leaf takes `--as <ROLE>` and `--json`; `--repo <DIR>` too, except `completion`, `schema`, `skills show`. `--input <JSON|FILE|->` runs a leaf from one JSON document (an array is a batch) and is only on the lines ending `[--input]`. Its document keys are the option names in camelCase, singular even when the option repeats (the value is then an array; none is the key left out, `[]` is refused), and `operands` holds the operands. `--fields <FIELDS>` is a comma list of the paths `canon schema <COMMAND> --json` declares under `outputs[].fields.paths`; a path is the record's own key, spelled as the answer spells it.
|
|
29
29
|
A `usage:` line shows the syntax and is not itself a command to run (the runnable example under it is): `<X>` is a value, `[x]` optional, `a | b` a choice, `(a | b)` exactly one is required, `[--x <V>]*` may repeat, `<X>+` is one or more, `[--a --b <V>]` go together. An option that is not on the line does not exist: it is refused (`USAGE`).
|
|
30
30
|
|
|
31
31
|
```text
|
|
@@ -177,7 +177,7 @@ canon scenario new auth.login.02 --title "Sign out" --feature .canon/specs/kind=
|
|
|
177
177
|
```
|
|
178
178
|
```text
|
|
179
179
|
# Describe canon's own commands
|
|
180
|
-
usage: canon schema [<PATH>]* [--
|
|
180
|
+
usage: canon schema [<PATH>]* [--schemas | --error <CODE> | --errors | --warning <CODE> | --warnings]
|
|
181
181
|
```
|
|
182
182
|
```bash
|
|
183
183
|
canon schema evidence add --json
|
|
@@ -224,7 +224,7 @@ After the first `status`, follow `meta.next` of each write; do not call
|
|
|
224
224
|
the commit it is about from `--rev` (default `HEAD`, any git revision). You
|
|
225
225
|
need not commit first: code that is not committed yet is recorded with its
|
|
226
226
|
`codeTree` and `worktreeDirty: true`, never refused. Outside git, or in a
|
|
227
|
-
repo with no commits, a write that needs a commit refuses `
|
|
227
|
+
repo with no commits, a write that needs a commit refuses `COMMIT_REQUIRED`.
|
|
228
228
|
|
|
229
229
|
The forms you reach for most (the story's ids; swap in yours):
|
|
230
230
|
|
|
@@ -253,7 +253,7 @@ canon evidence add --input '[{"scenario":"auth.login.01","class":"test-run","ref
|
|
|
253
253
|
keys are the option names in camelCase plus `operands` (the scenario id);
|
|
254
254
|
every element is validated before the first write, so a bad element
|
|
255
255
|
writes nothing and `error.field` names it (`/1/case`).
|
|
256
|
-
`canon schema scenario new --json` shows `input
|
|
256
|
+
`canon schema scenario new --json` shows `input` (its limits and a complete `example`); `canon schema scenario new --schemas --json` gives `Input`, the schema of one document.
|
|
257
257
|
(`scenario new --from` is gone.) When the gate asks for a missing case
|
|
258
258
|
(`require_cases`), add a new scenario; never retag an existing one. Every
|
|
259
259
|
bug fix adds or extends a scenario. Canon indexes added, edited or deleted
|
|
@@ -342,7 +342,9 @@ canon evidence add --input '[{"scenario":"auth.login.01","class":"test-run","ref
|
|
|
342
342
|
latest evidence was recorded on a different `codeTree` than the current
|
|
343
343
|
code (`code.exclude` in `canon.yaml` decides what is not code; the default
|
|
344
344
|
is `docs/**` and `*.md`). A docs-only chore needs its change-level review
|
|
345
|
-
alone
|
|
345
|
+
alone, and so does a chore whose approval recorded the code tree that is
|
|
346
|
+
still the current one (`(code tree <id>)` in its `Approved:` line; `status`
|
|
347
|
+
says so): it asks for no evidence at all. When code did change, the shipping refusal, `status` and
|
|
346
348
|
`meta.next` lead with one command over every report, with the real paths
|
|
347
349
|
(`--project <id>` is added only with several spec roots):
|
|
348
350
|
`canon evidence add --all-scenarios --report junit:a.xml --report junit:b.xml --role implementer`.
|
|
@@ -4,7 +4,7 @@ You run the loop across agents and move the subject. You write no brief,
|
|
|
4
4
|
code or review yourself. Declare the role with `CANON_ROLE=orchestrator` (or
|
|
5
5
|
`--as orchestrator`); your `canon status` also lists the human's steps. The
|
|
6
6
|
human's acts (`brief approve`, `policy approve`, `divergence accept`) refuse
|
|
7
|
-
every agent role, you included (`
|
|
7
|
+
every agent role, you included (`ACTOR_DENIED`), unless you record the answer the
|
|
8
8
|
human gave you in the conversation with `--relayed-via <tool>` (below). You never
|
|
9
9
|
run them without that answer, and never remove or unset your role (`env -u CANON_ROLE`,
|
|
10
10
|
dropping `--as`) to get past the refusal.
|
|
@@ -18,7 +18,7 @@ in your ids. Use only the options on a line; never guess one. Ask `canon schema
|
|
|
18
18
|
<command> --json` only for a leaf this block does not list, or after a `USAGE` refusal.
|
|
19
19
|
|
|
20
20
|
<!-- canon:generated commands-orchestrator begin -->
|
|
21
|
-
Every leaf takes `--as <ROLE>` and `--json`; `--repo <DIR>` too, except `completion`, `regime show`, `schema`, `selftest`, `skills show`. `--input <JSON|FILE|->` runs a leaf from one JSON document (an array is a batch) and is only on the lines ending `[--input]`. Its document keys are the option names in camelCase, singular even when the option repeats (the value is then an array), and `operands` holds the operands. `--fields <FIELDS>` is a comma list of the paths `canon schema <COMMAND> --json` declares under `outputs[].fields.paths`; a path is the record's own key, spelled as the answer spells it.
|
|
21
|
+
Every leaf takes `--as <ROLE>` and `--json`; `--repo <DIR>` too, except `completion`, `regime show`, `schema`, `selftest`, `skills show`. `--input <JSON|FILE|->` runs a leaf from one JSON document (an array is a batch) and is only on the lines ending `[--input]`. Its document keys are the option names in camelCase, singular even when the option repeats (the value is then an array; none is the key left out, `[]` is refused), and `operands` holds the operands. `--fields <FIELDS>` is a comma list of the paths `canon schema <COMMAND> --json` declares under `outputs[].fields.paths`; a path is the record's own key, spelled as the answer spells it.
|
|
22
22
|
A `usage:` line shows the syntax and is not itself a command to run (the runnable example under it is): `<X>` is a value, `[x]` optional, `a | b` a choice, `(a | b)` exactly one is required, `[--x <V>]*` may repeat, `<X>+` is one or more, `[--a --b <V>]` go together. An option that is not on the line does not exist: it is refused (`USAGE`).
|
|
23
23
|
|
|
24
24
|
```text
|
|
@@ -37,8 +37,8 @@ canon adapter validate --response adapter-response.json --json
|
|
|
37
37
|
```
|
|
38
38
|
```text
|
|
39
39
|
# Move the local artifact blobs to an object-store tier, verify them, and remove the local copies
|
|
40
|
-
usage: canon artifacts move --tier <TIER> [--commit --plan-digest <
|
|
41
|
-
# a bare run previews and prints planDigest; `--commit --plan-digest <
|
|
40
|
+
usage: canon artifacts move --tier <TIER> [--commit --plan-digest <PLAN_DIGEST>] [--input]
|
|
41
|
+
# a bare run previews and prints planDigest; `--commit --plan-digest <PLAN_DIGEST>` with that digest acts
|
|
42
42
|
```
|
|
43
43
|
```bash
|
|
44
44
|
canon artifacts move --tier cold --json
|
|
@@ -220,16 +220,16 @@ canon inventory sync --json
|
|
|
220
220
|
```
|
|
221
221
|
```text
|
|
222
222
|
# Move superseded versions of every record out of the ledger into the archive
|
|
223
|
-
usage: canon ledger compact [--commit --plan-digest <
|
|
224
|
-
# a bare run previews and prints planDigest; `--commit --plan-digest <
|
|
223
|
+
usage: canon ledger compact [--commit --plan-digest <PLAN_DIGEST>] [--input]
|
|
224
|
+
# a bare run previews and prints planDigest; `--commit --plan-digest <PLAN_DIGEST>` with that digest acts
|
|
225
225
|
```
|
|
226
226
|
```bash
|
|
227
227
|
canon ledger compact --json
|
|
228
228
|
```
|
|
229
229
|
```text
|
|
230
230
|
# Bring a repo from an earlier canon up to date
|
|
231
|
-
usage: canon migrate [--commit --plan-digest <
|
|
232
|
-
# a bare run previews and prints planDigest; `--commit --plan-digest <
|
|
231
|
+
usage: canon migrate [--commit --plan-digest <PLAN_DIGEST>] [--revert | --relayed-via <NAME>] [--backup <DIR> (with --revert)] [--actor <ACTOR_ID> (with --relayed-via)] [--approver <NAME> (with --relayed-via)] [--note <TEXT> (with --relayed-via)] [--input]
|
|
232
|
+
# a bare run previews and prints planDigest; `--commit --plan-digest <PLAN_DIGEST>` with that digest acts
|
|
233
233
|
```
|
|
234
234
|
```bash
|
|
235
235
|
canon migrate --json
|
|
@@ -264,8 +264,8 @@ canon prompt show reviewer@v1 --json
|
|
|
264
264
|
```
|
|
265
265
|
```text
|
|
266
266
|
# Remove allowlisted records older than a cutoff
|
|
267
|
-
usage: canon purge --kind <session|run|event|trajectory> --before <TIMESTAMP> [--commit --plan-digest <
|
|
268
|
-
# a bare run previews and prints planDigest; `--commit --plan-digest <
|
|
267
|
+
usage: canon purge --kind <session|run|event|trajectory> --before <TIMESTAMP> [--commit --plan-digest <PLAN_DIGEST>] [--input]
|
|
268
|
+
# a bare run previews and prints planDigest; `--commit --plan-digest <PLAN_DIGEST>` with that digest acts
|
|
269
269
|
```
|
|
270
270
|
```bash
|
|
271
271
|
canon purge --kind session --before 2020-01-01T00:00:00Z --json
|
|
@@ -314,7 +314,7 @@ canon retrieve --for-role reviewer --domain dev --limit 20 --json
|
|
|
314
314
|
```
|
|
315
315
|
```text
|
|
316
316
|
# Describe canon's own commands
|
|
317
|
-
usage: canon schema [<PATH>]* [--
|
|
317
|
+
usage: canon schema [<PATH>]* [--schemas | --error <CODE> | --errors | --warning <CODE> | --warnings]
|
|
318
318
|
```
|
|
319
319
|
```bash
|
|
320
320
|
canon schema evidence add --json
|
|
@@ -426,8 +426,8 @@ canon subject unadopt demo --change add-login --json
|
|
|
426
426
|
```
|
|
427
427
|
```text
|
|
428
428
|
# Apply canon.yaml aging rules, moving old records to their destination tier
|
|
429
|
-
usage: canon tier age [--commit --plan-digest <
|
|
430
|
-
# a bare run previews and prints planDigest; `--commit --plan-digest <
|
|
429
|
+
usage: canon tier age [--commit --plan-digest <PLAN_DIGEST>] [--input]
|
|
430
|
+
# a bare run previews and prints planDigest; `--commit --plan-digest <PLAN_DIGEST>` with that digest acts
|
|
431
431
|
```
|
|
432
432
|
```bash
|
|
433
433
|
canon tier age --json
|
|
@@ -527,16 +527,16 @@ Approve or fill the form. On their approval record it: `canon brief approve
|
|
|
527
527
|
<ask|AskUserQuestion|chat> --actor <your actor id> --digest <slug>=<the digest
|
|
528
528
|
shown>` (several slugs take one answer, each with its own `--digest`; nothing is written
|
|
529
529
|
if one is refused). The record says you recorded it, with your role, actor and
|
|
530
|
-
tool. `
|
|
530
|
+
tool. `RELAY_DIGEST_STALE` means the brief changed after they saw it: show it
|
|
531
531
|
again. When `canon.yaml` has `approval: { relay: deny }` the call is refused
|
|
532
|
-
(`
|
|
532
|
+
(`ACTOR_DENIED`, naming the key): report the human's own call and wait for them to
|
|
533
533
|
run it. Removing or unsetting your declared role (`env -u CANON_ROLE`,
|
|
534
534
|
dropping `--as`) to get past a refusal is the same act under another label.
|
|
535
535
|
`canon skills show role-planner` has the full procedure. Do not start the
|
|
536
536
|
implementer before `canon brief show <slug>` reports `state: approved`.
|
|
537
537
|
Never approve it yourself and never edit the policy to pass the gate. A
|
|
538
538
|
policy that no longer matches the approval fails closed
|
|
539
|
-
(`
|
|
539
|
+
(`POLICY_APPROVAL_STALE`, or `POLICY_APPROVAL_CORRUPT`): the ship
|
|
540
540
|
guard and the reopen refuse, and `--override-reason` does not waive it. Run
|
|
541
541
|
`canon policy show`, then show the policy to the human, ask them to re-approve
|
|
542
542
|
and record their explicit answer (`canon policy approve --approver <their name>
|
|
@@ -576,7 +576,7 @@ its preview, never from an old digest.
|
|
|
576
576
|
|
|
577
577
|
| The thought | The reality |
|
|
578
578
|
|---|---|
|
|
579
|
-
| "Edit the policy so the gate passes." | A changed policy fails closed (`
|
|
579
|
+
| "Edit the policy so the gate passes." | A changed policy fails closed (`POLICY_APPROVAL_STALE`); ask the human to re-approve or restore it from git. |
|
|
580
580
|
| "The reviewer can be me under another label." | The reviewer is a separate process with its own real session id (#39). |
|
|
581
581
|
| "Approve the brief; the human said they are busy." | An answer they did not give is not recorded. Show the brief, ask, and record only an explicit approval with `--relayed-via`. |
|
|
582
582
|
| "Override the refusal to ship." | Fix the gap the refusal names; `--override-reason` waives only the `require_review` gaps and the brief gap, is recorded on the subject, and is for the human's call, not a shortcut. |
|
|
@@ -591,7 +591,8 @@ directly (a transition is a state change, not a destructive act) and is not
|
|
|
591
591
|
repeatable: a move to the state the subject is already in is refused
|
|
592
592
|
(exit 2), so after a lost response read `subject show` before you retry.
|
|
593
593
|
It refuses a move the policy does not allow (missing evidence or reviews,
|
|
594
|
-
open blockers, an unapproved brief) with
|
|
594
|
+
open blockers, an unapproved brief) with exit 2 and the code of the condition
|
|
595
|
+
(`SUBJECT_APPROVAL_REQUIRED` for a missing review, evidence or approval, `EVIDENCE_STALE`, `SUBJECT_INVALID` for the rest; several causes are `error.details[]`),
|
|
595
596
|
the record unchanged; fix the gap rather than overriding. Move to `shipped`
|
|
596
597
|
yourself once its guard passes, unless the brief says the human ships. A
|
|
597
598
|
follow-up on a shipped subject goes back to `verifying` with `--reason`,
|
|
@@ -614,7 +615,7 @@ red. A bad `--to` fails with `error.field` `--to` and `error.expected`
|
|
|
614
615
|
listing the states.
|
|
615
616
|
|
|
616
617
|
**Done when:** `canon subject show demo` (the subject's id) reports the
|
|
617
|
-
state you moved it to and `canon gate check` is clean; when the move exits
|
|
618
|
+
state you moved it to and `canon gate check` is clean; when the move exits 2,
|
|
618
619
|
read the refusal in `error` of `canon subject move demo --to shipped --json`.
|
|
619
620
|
|
|
620
621
|
## Destructive commands preview first
|
|
@@ -629,7 +630,7 @@ digits, over the effects and what the plan read, so a file or record the plan
|
|
|
629
630
|
read that changed since is `PLAN_STALE` too, and `meta.next[0]` is the preview
|
|
630
631
|
to run again. A commit holds the repository write lock for its whole run:
|
|
631
632
|
another command that writes waits for it, and one that waited 30 seconds
|
|
632
|
-
answers `
|
|
633
|
+
answers `REPO_LOCK_UNAVAILABLE` (exit 2, retryable): run it again. A document passed
|
|
633
634
|
with `--input` never carries `--commit` or `--plan-digest`, and these five
|
|
634
635
|
leaves take one object only (`INPUT_INVALID`).
|
|
635
636
|
|
|
@@ -675,7 +676,7 @@ canon skills install
|
|
|
675
676
|
moves: commit first. In CI run it with full history (`fetch-depth: 0`).
|
|
676
677
|
3. `canon skills install` refreshes the stub and the scripts for the selected
|
|
677
678
|
harnesses; `canon skills check` reports a skill written by another canon
|
|
678
|
-
version (exit 1, `
|
|
679
|
+
version (exit 1, `SKILLS_CHECK_FAILED`), `canon skills doctor` explains it.
|
|
679
680
|
|
|
680
681
|
Commit what it changes, except the backup: `.canon/migrate-backup/` is local and
|
|
681
682
|
git-ignored, and `canon migrate --revert` needs it (keep it until you are sure).
|
|
@@ -6,7 +6,7 @@ brief the human answers once. You build nothing. Declare the role with
|
|
|
6
6
|
then show your steps and count the rest under `waitingOn`. The approvals are
|
|
7
7
|
the human's: `brief approve`, `policy approve`, `divergence accept` and the
|
|
8
8
|
`migrate --commit` that re-binds `Approved:` lines refuse every agent role
|
|
9
|
-
(`
|
|
9
|
+
(`ACTOR_DENIED`, `retryable: false`) unless you record the answer the human gave
|
|
10
10
|
you in the conversation, with `--relayed-via <tool>` (step 4). Without a human's
|
|
11
11
|
explicit answer you never run them, and you never remove or unset your role
|
|
12
12
|
(`env -u CANON_ROLE`, dropping `--as`) to get past the refusal.
|
|
@@ -20,7 +20,7 @@ in your ids. Use only the options on a line; never guess one. Ask `canon schema
|
|
|
20
20
|
<command> --json` only for a leaf this block does not list, or after a `USAGE` refusal.
|
|
21
21
|
|
|
22
22
|
<!-- canon:generated commands-planner begin -->
|
|
23
|
-
Every leaf takes `--as <ROLE>` and `--json`; `--repo <DIR>` too, except `completion`, `schema`, `skills show`. `--input <JSON|FILE|->` runs a leaf from one JSON document (an array is a batch) and is only on the lines ending `[--input]`. Its document keys are the option names in camelCase, singular even when the option repeats (the value is then an array), and `operands` holds the operands. `--fields <FIELDS>` is a comma list of the paths `canon schema <COMMAND> --json` declares under `outputs[].fields.paths`; a path is the record's own key, spelled as the answer spells it.
|
|
23
|
+
Every leaf takes `--as <ROLE>` and `--json`; `--repo <DIR>` too, except `completion`, `schema`, `skills show`. `--input <JSON|FILE|->` runs a leaf from one JSON document (an array is a batch) and is only on the lines ending `[--input]`. Its document keys are the option names in camelCase, singular even when the option repeats (the value is then an array; none is the key left out, `[]` is refused), and `operands` holds the operands. `--fields <FIELDS>` is a comma list of the paths `canon schema <COMMAND> --json` declares under `outputs[].fields.paths`; a path is the record's own key, spelled as the answer spells it.
|
|
24
24
|
A `usage:` line shows the syntax and is not itself a command to run (the runnable example under it is): `<X>` is a value, `[x]` optional, `a | b` a choice, `(a | b)` exactly one is required, `[--x <V>]*` may repeat, `<X>+` is one or more, `[--a --b <V>]` go together. An option that is not on the line does not exist: it is refused (`USAGE`).
|
|
25
25
|
|
|
26
26
|
```text
|
|
@@ -116,7 +116,7 @@ canon scenario new auth.login.02 --title "Sign out" --feature .canon/specs/kind=
|
|
|
116
116
|
```
|
|
117
117
|
```text
|
|
118
118
|
# Describe canon's own commands
|
|
119
|
-
usage: canon schema [<PATH>]* [--
|
|
119
|
+
usage: canon schema [<PATH>]* [--schemas | --error <CODE> | --errors | --warning <CODE> | --warnings]
|
|
120
120
|
```
|
|
121
121
|
```bash
|
|
122
122
|
canon schema evidence add --json
|
|
@@ -183,7 +183,7 @@ lists N blockers`); then, while prose advisories remain, to the polish pass
|
|
|
183
183
|
(`polish the brief in <path> (canon skills show brief-polish), then run canon
|
|
184
184
|
brief check <slug>`, with the advisory count and the top rule
|
|
185
185
|
ids); the human step comes after it. A policy that no longer matches its approval fails closed
|
|
186
|
-
(`
|
|
186
|
+
(`POLICY_APPROVAL_STALE`): never edit it; the human re-approves.
|
|
187
187
|
|
|
188
188
|
## Steps
|
|
189
189
|
|
|
@@ -286,9 +286,9 @@ ids); the human step comes after it. A policy that no longer matches its approva
|
|
|
286
286
|
show` and the dashboard name it. Never approve in their name without their
|
|
287
287
|
answer, never write the answer for them, and never edit the policy to make
|
|
288
288
|
the gate pass. A digest that differs from the brief now
|
|
289
|
-
(`
|
|
289
|
+
(`RELAY_DIGEST_STALE`) means the brief changed after they saw it: show
|
|
290
290
|
it again and ask again; nothing was written. Without `--relayed-via` the call is
|
|
291
|
-
`
|
|
291
|
+
`ACTOR_DENIED`; with it and no role declared, `USAGE`. When `canon.yaml`
|
|
292
292
|
turns relaying off (`approval: { relay: deny }`), the refusal names that key:
|
|
293
293
|
report the human's call (`canon brief approve add-login --approver <their
|
|
294
294
|
name> --note "<their own words>"`) and wait for them to run it. Never
|
|
@@ -300,7 +300,7 @@ ids); the human step comes after it. A policy that no longer matches its approva
|
|
|
300
300
|
evidence with its reason and tracking reference, the migrate plan), ask,
|
|
301
301
|
count only an explicit approval, then record with the relay option.
|
|
302
302
|
`canon brief show <slug>` then reports `state: approved`. A brief edited
|
|
303
|
-
after its approval is not approved (`
|
|
303
|
+
after its approval is not approved (`BRIEF_APPROVAL_STALE`): it
|
|
304
304
|
needs a new answer, shown and asked again, and a new `brief approve`. A follow-up that
|
|
305
305
|
adds or changes a step of the brief is a scope change and needs a new
|
|
306
306
|
answer.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
You are the independent second look. Declare the role with
|
|
4
4
|
`CANON_ROLE=reviewer` (or `--as reviewer`); `--role` on `review scenario`,
|
|
5
5
|
`review change` and `finding add` then defaults to `reviewer`. The human's
|
|
6
|
-
acts refuse you (`
|
|
6
|
+
acts refuse you (`ACTOR_DENIED`): `brief approve`, `policy approve` and
|
|
7
7
|
`divergence accept`, unless you record the answer the human gave you in the
|
|
8
8
|
conversation with `--relayed-via <tool>` (the divergence acceptance below).
|
|
9
9
|
Name what the human has to decide; never look for another flag that grants it.
|
|
@@ -19,7 +19,7 @@ in your ids. Use only the options on a line; never guess one. Ask `canon schema
|
|
|
19
19
|
<command> --json` only for a leaf this block does not list, or after a `USAGE` refusal.
|
|
20
20
|
|
|
21
21
|
<!-- canon:generated commands-reviewer begin -->
|
|
22
|
-
Every leaf takes `--as <ROLE>` and `--json`; `--repo <DIR>` too, except `completion`, `schema`, `skills show`. `--input <JSON|FILE|->` runs a leaf from one JSON document (an array is a batch) and is only on the lines ending `[--input]`. Its document keys are the option names in camelCase, singular even when the option repeats (the value is then an array), and `operands` holds the operands. `--fields <FIELDS>` is a comma list of the paths `canon schema <COMMAND> --json` declares under `outputs[].fields.paths`; a path is the record's own key, spelled as the answer spells it.
|
|
22
|
+
Every leaf takes `--as <ROLE>` and `--json`; `--repo <DIR>` too, except `completion`, `schema`, `skills show`. `--input <JSON|FILE|->` runs a leaf from one JSON document (an array is a batch) and is only on the lines ending `[--input]`. Its document keys are the option names in camelCase, singular even when the option repeats (the value is then an array; none is the key left out, `[]` is refused), and `operands` holds the operands. `--fields <FIELDS>` is a comma list of the paths `canon schema <COMMAND> --json` declares under `outputs[].fields.paths`; a path is the record's own key, spelled as the answer spells it.
|
|
23
23
|
A `usage:` line shows the syntax and is not itself a command to run (the runnable example under it is): `<X>` is a value, `[x]` optional, `a | b` a choice, `(a | b)` exactly one is required, `[--x <V>]*` may repeat, `<X>+` is one or more, `[--a --b <V>]` go together. An option that is not on the line does not exist: it is refused (`USAGE`).
|
|
24
24
|
|
|
25
25
|
```text
|
|
@@ -87,7 +87,7 @@ canon finding add --change add-login --round 1 --seq 2 --severity should-fix --i
|
|
|
87
87
|
```
|
|
88
88
|
```text
|
|
89
89
|
# Move an already-committed finding's disposition
|
|
90
|
-
usage: canon finding close <CHANGE_ID> --round <N> --seq <N> --disposition <
|
|
90
|
+
usage: canon finding close <CHANGE_ID> --round <N> --seq <N> --disposition <fixed|rejected|deferred> [--resolution-rev <REV>] [--reason <TEXT>] [--actor <ACTOR_ID>] [--role <ROLE>] [--session <SESSION_ID>] [--promote | --no-promote] [--input]
|
|
91
91
|
```
|
|
92
92
|
```bash
|
|
93
93
|
canon finding close add-login --round 1 --seq 1 --disposition rejected --reason "works as designed" --json
|
|
@@ -143,7 +143,7 @@ canon review scenario auth.login.01 --actor alice --role reviewer --original-spe
|
|
|
143
143
|
```
|
|
144
144
|
```text
|
|
145
145
|
# Describe canon's own commands
|
|
146
|
-
usage: canon schema [<PATH>]* [--
|
|
146
|
+
usage: canon schema [<PATH>]* [--schemas | --error <CODE> | --errors | --warning <CODE> | --warnings]
|
|
147
147
|
```
|
|
148
148
|
```bash
|
|
149
149
|
canon schema evidence add --json
|
|
@@ -288,7 +288,7 @@ sign.
|
|
|
288
288
|
`divergence accept` is for a scenario whose honest evidence is `divergent`
|
|
289
289
|
and whose gap is limited by something outside this change (an upstream
|
|
290
290
|
limit, a platform bug) and is tracked there. It records a human's decision,
|
|
291
|
-
so it refuses every agent role (`
|
|
291
|
+
so it refuses every agent role (`ACTOR_DENIED`), you included, unless it records
|
|
292
292
|
the answer the human gave you. What you do: confirm the evidence really is
|
|
293
293
|
divergent and the limit is outside this change, then put to the human the
|
|
294
294
|
scenario ids, the reason, the tracking reference and an expiry when the limit
|
|
@@ -297,11 +297,11 @@ Ask with the harness question tool (`ask` in omp, `AskUserQuestion` in Claude
|
|
|
297
297
|
Code, otherwise in the chat): accept the gap, or not. Only an explicit
|
|
298
298
|
approval counts; a question or a condition is not one, and no answer records
|
|
299
299
|
nothing. Then record it from a session that did not attest the evidence
|
|
300
|
-
(`
|
|
300
|
+
(`DIVERGENCE_DENIED` otherwise): `canon divergence accept <ids> --actor
|
|
301
301
|
<your actor id> --reason "<why>" --tracking <ref> --approver <their name> --note
|
|
302
302
|
"<their answer>" --relayed-via <tool>`; the record carries the relay, the
|
|
303
303
|
approver and their answer. When `canon.yaml` has `approval: { relay: deny }` the
|
|
304
|
-
call is refused (`
|
|
304
|
+
call is refused (`ACTOR_DENIED`, naming the key) and the human runs it themselves.
|
|
305
305
|
You never unset your role to run it. Never suggest it to skip
|
|
306
306
|
a fix the implementer can make in this change. The acceptance pins that
|
|
307
307
|
evidence: new evidence for the scenario, or its expiry, ends it, and the
|
|
@@ -358,7 +358,7 @@ implementer owns. Your last write's `meta.next` names the next step.
|
|
|
358
358
|
identical repeat is reported `unchanged` (`data.unchanged: true`, or the
|
|
359
359
|
element's `status` in a batch), so after a timeout run the same command
|
|
360
360
|
again. A different finding under an occupied round and seq is refused
|
|
361
|
-
(`
|
|
361
|
+
(`FINDING_EXISTS`): take the next seq. `finding close` with the same
|
|
362
362
|
disposition is a no-op too.
|
|
363
363
|
|
|
364
364
|
## Excuses that fail
|
|
@@ -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.
|
|
3
|
+
.TH canon-adapter-authorize 1 "authorize 0.37.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.
|
|
44
|
+
v0.37.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.
|
|
3
|
+
.TH canon-adapter-validate 1 "validate 0.37.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.
|
|
44
|
+
v0.37.0
|
package/man/canon-adapter.1
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
.ie \n(.g .ds Aq \(aq
|
|
2
2
|
.el .ds Aq '
|
|
3
|
-
.TH canon-adapter 1 "adapter 0.
|
|
3
|
+
.TH canon-adapter 1 "adapter 0.37.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.
|
|
46
|
+
v0.37.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.
|
|
3
|
+
.TH canon-artifacts-move 1 "move 0.37.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
|
|
@@ -30,10 +30,10 @@ orchestrator
|
|
|
30
30
|
The tier to move to: the name of an `s3` tier in canon.yaml (for example `cold`)
|
|
31
31
|
.TP
|
|
32
32
|
\fB\-\-commit\fR
|
|
33
|
-
|
|
33
|
+
Make the change; without it the command only previews.
|
|
34
34
|
.TP
|
|
35
|
-
\fB\-\-plan\-digest\fR \fI<
|
|
36
|
-
The
|
|
35
|
+
\fB\-\-plan\-digest\fR \fI<PLAN_DIGEST>\fR
|
|
36
|
+
The digest of the preview this commit carries out.
|
|
37
37
|
.TP
|
|
38
38
|
\fB\-\-repo\fR \fI<DIR>\fR
|
|
39
39
|
The repo to act on (default: the nearest ancestor directory holding a canon.yaml)
|
|
@@ -52,7 +52,7 @@ Print version
|
|
|
52
52
|
.SH EXTRA
|
|
53
53
|
Examples:
|
|
54
54
|
canon artifacts move \-\-tier cold
|
|
55
|
-
canon artifacts move \-\-tier cold \-\-commit \-\-plan\-digest <
|
|
55
|
+
canon artifacts move \-\-tier cold \-\-commit \-\-plan\-digest <PLAN_DIGEST>
|
|
56
56
|
|
|
57
57
|
The bare run previews: it lists every upload and removal and prints a planDigest, and writes nothing. \-\-commit \-\-plan\-digest acts on exactly that plan (PLAN_STALE, exit 2, when it changed since).
|
|
58
58
|
|
|
@@ -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.
|
|
63
|
+
v0.37.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.
|
|
3
|
+
.TH canon-artifacts-store 1 "store 0.37.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.
|
|
54
|
+
v0.37.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.
|
|
3
|
+
.TH canon-artifacts-verify 1 "verify 0.37.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
|
|
@@ -45,4 +45,4 @@ Asks the store canon.yaml\*(Aqs `artifacts:` block selects (default: local, .can
|
|
|
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
47
|
.SH VERSION
|
|
48
|
-
v0.
|
|
48
|
+
v0.37.0
|
package/man/canon-artifacts.1
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
.ie \n(.g .ds Aq \(aq
|
|
2
2
|
.el .ds Aq '
|
|
3
|
-
.TH canon-artifacts 1 "artifacts 0.
|
|
3
|
+
.TH canon-artifacts 1 "artifacts 0.37.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
|
|
@@ -42,4 +42,4 @@ Store the bound files of existing evidence records and current reviews in the ar
|
|
|
42
42
|
canon\-artifacts\-move(1)
|
|
43
43
|
Move the local artifact blobs to an object\-store tier, verify them, and remove the local copies
|
|
44
44
|
.SH VERSION
|
|
45
|
-
v0.
|
|
45
|
+
v0.37.0
|