@mrciphersmith/keryx 0.3.110 → 0.3.112

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrciphersmith/keryx",
3
- "version": "0.3.110",
3
+ "version": "0.3.112",
4
4
  "description": "Version-controlled project context for AI coding agents: code graph, architecture wiki, project memory, relevant tests, quality signals, and task flows.",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -689,3 +689,42 @@ Use it to understand:
689
689
  - Architectural decisions already agreed upon, and acceptance criteria driving the Stage 1 spec compliance gate
690
690
 
691
691
  If absent, proceed normally — context is optional and non-blocking.
692
+
693
+ ## The mutation pass — `keryx review mutate`
694
+
695
+ Attended, the pass is not optional once mutants were proposed. The testing reviewer writes
696
+ each proposed mutant to `<review-dir>/research-evidence/mutants.json`:
697
+ `{ "mutants": [{ "id", "file", "anchor", "replacement" }] }`. `anchor` is exact text that
698
+ occurs once in `file`; `"runnable": false` at the top level says the suite cannot run here.
699
+
700
+ Run `keryx review mutate --test "<the nearest suite command>" --package <review-dir>`. It
701
+ applies each mutant in a scratch copy of the worktree (never in the worktree), refuses to
702
+ start when the baseline is red, and writes the table to `research-evidence/mutation-<n>.md`
703
+ and `.json`. A mutant is `killed` (the suite went red), `survived` (nothing pins that
704
+ behaviour), `timeout`, or `invalid` (anchor missing or not unique, file outside the copy).
705
+ A survivor is evidence for the finding that names it.
706
+
707
+ `keryx review complete` refuses while proposed mutants are unrun, unless
708
+ `dispatch.mutationWaiver = { operatorQuote, reason }` carries the operator's own words.
709
+ `keryx review run --autonomous` is unchanged: it records `Not run: mutation pass` as before.
710
+
711
+ ### Severity audit — `keryx review severity-audit`
712
+
713
+ A reviewer that argues a finding from a mutant writes `mutant:<id>` in the finding's `evidence`.
714
+ After the mutation pass run `keryx review severity-audit --package <review-dir>`: a cited mutant
715
+ that survived on a file the review changed raises a minor finding to major and records
716
+ `severity_audit {from, to, evidence: "mutation-<n>.json#<id>"}`. A finding that cites a mutant no
717
+ run executed stays minor (a major is capped at minor) and gets the label `unproven`. The audit
718
+ never deletes a finding and never touches a blocker; it is a separate pass from the verifier,
719
+ which can only delete. `--dry-run` prints the changes without writing `findings.json`.
720
+
721
+ ### Pull request context — `keryx review context-collect`
722
+
723
+ A pull-request review starts with `keryx review context-collect --repo <o/r> --pr <n> --package <review-dir>`.
724
+ It writes `pr-context.json` and `pr-context.md` into the package: every review comment in full (the
725
+ 800-character cut applies only to a finding's `problem`), the round-1 intent (kept when a later round
726
+ collects a new head), the CI status (`--checks <file>` or `gh pr checks`; `unknown` when neither is
727
+ available) and the backend pins the pull request names (refs on lines that talk about the backend).
728
+ Set `pr_context` in every reviewer payload to the `.md` path; reviewers read it before the diff.
729
+ `keryx review dispatch-check --payload <file> --pr-context` refuses a payload without it
730
+ (`REVIEWER_INPUT_NO_PR_CONTEXT`).
@@ -1102,7 +1102,7 @@ whoever reads the merge commit a year later reads the body. When `review.jev.con
1102
1102
 
1103
1103
  **Dispatch integrity is a completion prerequisite.** Use one distinct execution per selected reviewer role; do not combine multiple roles in one child or count sections of one response as independent runs. When budgets are tight, use sequential waves, not role batching. Resolve every project-rule anchor before dispatch; missing rules require context recovery or a blocked result, never silently skipped checks. A read-only pass cannot discharge executable obligations: dispatch a capable execution pass and retain its evidence. Partial scope and NEEDS_CONTEXT remain incomplete until rerun over the outstanding scope.
1104
1104
 
1105
- **The reviewer set is not yours to shrink.** Run `keryx review required --mode all|diff --scope <scope.json>` (`all` for `--all` or no narrowing flag; `diff` only when the operator named a narrower mode), dispatch every reviewer it prints, and declare `mode` in `dispatch`; pass the same `--scope` to `keryx review start|ingest` so the package keeps the file list. Closure refuses a smaller set unless `dispatch.override = { operatorQuote, reason }` carries the operator's own words. New managed packages declare `reviewerDispatch: "research.json"`. Alongside the research ledger, provide `dispatch: { version: 1, mode: "all"|"diff", selected: [...], unresolvedRules: [], runs: [...] }`. Preserve the actual computed reviewer inventory. Each run has `reviewer`, unique `executionId`, `status: "complete"`, `scopeComplete: true`, `rawEvidence`, nonempty `ruleEvidence`, and boolean `executionRequired`. Required execution needs nonempty `executionEvidence` (command/output references); a source-only scope requires `executionReason`. Do not fabricate IDs or mark truncated responses complete. Runtime validates these declarations at closure and the flow gate, not their truth: independently audit evidence and inventory before freezing. Legacy artifact absence is compatibility, not proof of a correct launch. Research closure is mandatory: see [Runtime research-completion ledger](SKILL.detail.md#runtime-research-completion-ledger).
1105
+ **The reviewer set is not yours to shrink.** Run `keryx review required --mode all|diff --scope <scope.json>` (`all` for a pull request, for `--all` and for no narrowing flag; `diff` only when the operator named a narrower mode — pass their words as `--operator-quote` and record them as `dispatch.operatorQuote`, without which the dispatch is refused), dispatch every reviewer it prints, and declare `mode` in `dispatch`; pass the same `--scope` to `keryx review start|ingest` so the package keeps the file list. Closure refuses a smaller set unless `dispatch.override = { operatorQuote, reason }` carries the operator's own words. New managed packages declare `reviewerDispatch: "research.json"`. Alongside the research ledger, provide `dispatch: { version: 1, mode: "all"|"diff", selected: [...], unresolvedRules: [], runs: [...] }`. Preserve the actual computed reviewer inventory. Each run has `reviewer`, unique `executionId`, `status: "complete"`, `scopeComplete: true`, `rawEvidence`, nonempty `ruleEvidence`, and boolean `executionRequired`. Required execution needs nonempty `executionEvidence` (command/output references); a source-only scope requires `executionReason`. Do not fabricate IDs or mark truncated responses complete. Runtime validates these declarations at closure and the flow gate, not their truth: independently audit evidence and inventory before freezing. Legacy artifact absence is compatibility, not proof of a correct launch. Research closure is mandatory: see [Runtime research-completion ledger](SKILL.detail.md#runtime-research-completion-ledger).
1106
1106
 
1107
1107
  Dispatch selected reviewers in parallel when independent — this engine dispatches them itself (see "How to spawn"); a host without a dispatch tool returns `STATUS: BLOCKED` (`nested_dispatch_unavailable`) and never reviews alone — Preflight 1. Waves follow the diff domains in "Control" and keep their dependency order:
1108
1108
 
@@ -1124,7 +1124,7 @@ finding class is unreachable for the entire round, and no amount of verification
1124
1124
  downstream recovers it. When a testing reviewer returns without a mutation table,
1125
1125
  treat it the way you would treat a reviewer that returned without findings *and*
1126
1126
  without evidence: ask once, then record that the pass did not run. Unattended: record
1127
- `Not run: mutation pass` without asking.
1127
+ `Not run: mutation pass` without asking. Attended: run `keryx review mutate` ([The mutation pass](SKILL.detail.md#the-mutation-pass-keryx-review-mutate)).
1128
1128
 
1129
1129
  ### Wave C — verification, and what it replaced
1130
1130
 
@@ -160,6 +160,13 @@
160
160
  "null"
161
161
  ]
162
162
  },
163
+ "pr_context": {
164
+ "type": [
165
+ "string",
166
+ "null"
167
+ ],
168
+ "description": "Path of the `pr-context.md` that `keryx review context-collect` wrote into the review package: every review comment in full, the round-1 intent, the CI status and the backend pins the pull request names. Required of a pull-request review by `keryx review dispatch-check --pr-context <package>`; a reviewer reads it before the diff."
169
+ },
163
170
  "round": {
164
171
  "type": "integer",
165
172
  "minimum": 1,