@mrciphersmith/keryx 0.3.113 → 0.3.115

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/core.js CHANGED
@@ -28739,10 +28739,12 @@ function researchErrors(value, findings) {
28739
28739
  ids.add(id);
28740
28740
  if (!nonempty(o.source) || !nonempty(o.question))
28741
28741
  errors.push(`${id}: source and question are required`);
28742
- if (!["finding", "refuted", "out-of-scope"].includes(String(o.status)))
28742
+ if (!["finding", "refuted", "out-of-scope", "narrowed"].includes(String(o.status)))
28743
28743
  errors.push(`${id}: unresolved research (${String(o.status)})`);
28744
28744
  if (!nonempty(o.evidence) || !nonempty(o.reason))
28745
28745
  errors.push(`${id}: closure needs evidence and reason`);
28746
+ if (o.status === "narrowed" && !nonempty(o.remains))
28747
+ errors.push(`${id}: narrowed needs a "what remains" text`);
28746
28748
  if (o.status === "finding") {
28747
28749
  const matches = findings.filter((f) => f && typeof f === "object" && (f.id === o.finding || f.global_id === o.finding));
28748
28750
  if (!nonempty(o.finding) || matches.length !== 1)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrciphersmith/keryx",
3
- "version": "0.3.113",
3
+ "version": "0.3.115",
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": {
@@ -207,8 +207,7 @@ keryx review complete <review-id-or-path>
207
207
  [--finding <id> --disposition <state> --evidence <ref>]...
208
208
  ```
209
209
 
210
- **An unrecognised option is refused, not ignored** — a misspelled flag exits
211
- non-zero rather than printing `status: closed` and writing nothing at all.
210
+ **An unrecognised option is refused, not ignored** — a misspelled flag exits non-zero rather than printing `status: closed` and writing nothing at all.
212
211
 
213
212
  `--verifications` takes what `review-verifier` returned. `--scope` takes the
214
213
  whole `--json` output of `keryx review scope`, so the package records what the
@@ -234,9 +233,7 @@ Two channels, and both work:
234
233
  it: it is copied into the package it screened and removed from the slot, so a
235
234
  later round cannot be screened against a set nobody recomputed.
236
235
 
237
- Do **not** write the record inside the package directory before the ingest. A
238
- round that names no `--review-id` has not allocated that directory yet, and
239
- creating it makes the ingest take the next free name instead.
236
+ Do **not** write the record inside the package directory before the ingest. A round that names no `--review-id` has not allocated that directory yet, and creating it makes the ingest take the next free name instead.
240
237
 
241
238
  `--refuted` takes the findings this round **raised and then dismissed**, in the
242
239
  same finding shape, each carrying `disposition: {state, evidence}` with one of
@@ -252,9 +249,12 @@ Everything except `unknown` must cite where the outcome is written down — the
252
249
  commit, the test, the decision. A recorded state and its citation cannot be
253
250
  overwritten by a later close; record a correction as a new round.
254
251
 
255
- **Closing a fix round without dispositions leaves every finding reading
256
- `unknown`.** That is not "the reviewers were right"; it is "nobody wrote down
257
- what happened", and it is the single reason the precision figure cannot be read.
252
+ `review complete` on a PR-bound package refuses a merged PR or a moved head unless `report.md`'s first line names the reviewed SHA and says so; a package with no PR binding is unaffected.
253
+ `review complete` refuses a report with no `Evidence level:` line (`static only — did not run: <what>` or `ran — <what>`); a package ingested before the field existed only warns.
254
+ `review ingest` refuses an internal finding whose `quote` is not at its `path` at the reviewed SHA, and adds a `citation not found` line, never a deletion, to a rebuttal citing a rule or document that is not in the tree.
255
+ A finding may close as `narrowed` (research obligation `"status":"narrowed","remains":"<what remains>"`); it counts as closed only with that text, and the report keeps it under "Refuted and narrowed".
256
+
257
+ **Closing a fix round without dispositions leaves every finding reading `unknown`.** That is not "the reviewers were right"; it is "nobody wrote down what happened", and it is the single reason the precision figure cannot be read.
258
258
 
259
259
  Managed modes:
260
260
 
@@ -259,6 +259,19 @@
259
259
  },
260
260
  "additionalProperties": false
261
261
  }
262
+ },
263
+ "unavailable": {
264
+ "type": "array",
265
+ "description": "Sections that could not be read, with the reason. An empty section that is not listed here was read and held nothing.",
266
+ "items": {
267
+ "type": "object",
268
+ "required": ["section", "reason"],
269
+ "properties": {
270
+ "section": { "enum": ["affected", "wiki", "memory"] },
271
+ "reason": { "type": "string" }
272
+ },
273
+ "additionalProperties": false
274
+ }
262
275
  }
263
276
  },
264
277
  "additionalProperties": false
@@ -34,8 +34,10 @@ what a reader must act on; everything else is folded.
34
34
 
35
35
  ```markdown
36
36
  <!-- slot:pre-verdict -->
37
+ <only when the PR merged or its head moved: "Reviewed `<sha>` — the PR has since merged / moved on to `<new sha>`." as the very first line>
37
38
  **Changes requested — 1 Blocker, 2 Major, 4 Minor, 1 question.** <what holds, and where the risk is — one sentence.>
38
39
  Reviewed `<head>` against `<base>` · round N · <files> files, +<add>/−<del> · CI <green | red: check names>.
40
+ Evidence level: <static only — did not run: tests, build | ran — the commands that ran>
39
41
  <!-- slot:after-verdict -->
40
42
 
41
43
  ### Prior findings (fix rounds only)
@@ -43,6 +45,7 @@ Reviewed `<head>` against `<base>` · round N · <files> files, +<add>/−<del>
43
45
  ### Major
44
46
  ### Minor
45
47
  ### Questions
48
+ ### Refuted and narrowed (only when a finding was dismissed or narrowed)
46
49
 
47
50
  <details><summary><b>Pre-existing (not blocking)</b></summary> … </details>
48
51
  <details><summary><b>Scope</b></summary> … </details> (only when a pr-process note exists)
@@ -68,6 +71,25 @@ author answer, rendered under Questions, not as a finding.
68
71
  The second line is the context line: head, base, round, size, CI. If head moved
69
72
  during the round, add `· unchecked: <commits>`.
70
73
 
74
+ The third line is the **evidence level** and is required: `Evidence level: static
75
+ only — did not run: <what>` when nothing was executed, or `Evidence level: ran —
76
+ <what ran>`. `keryx review complete` refuses a report without it.
77
+
78
+ When the PR was merged or its head moved after the review, the report's first line
79
+ says so and names the reviewed SHA, or `keryx review complete` refuses.
80
+
81
+ ### Refuted and narrowed
82
+
83
+ One line per finding that did not stand as reported, kept with its evidence so a
84
+ reader sees what was claimed and why it was set aside:
85
+
86
+ ```markdown
87
+ - **F-007. Dismissed** — <the author's rebuttal, quoted>. <citation not found: …> where the cited rule is not in the tree.
88
+ - **F-009. Narrowed** — <what the finding claimed>. **Remains:** <what is still open>. Evidence: <what was run>.
89
+ ```
90
+
91
+ A narrowed finding counts as closed only with its "Remains" text.
92
+
71
93
  ## One finding
72
94
 
73
95
  Blocker and Major as a paragraph, visible: