@mrciphersmith/keryx 0.3.82 → 0.3.83

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/cli.js CHANGED
@@ -17288,7 +17288,7 @@ var init_skill_length_ceilings = __esm(() => {
17288
17288
  "review/review-jev-scenarios": 187,
17289
17289
  "review/review-layout": 238,
17290
17290
  "review/review-logic": 377,
17291
- "review/review-orchestrator": 1723,
17291
+ "review/review-orchestrator": 1712,
17292
17292
  "review/review-performance": 374,
17293
17293
  "review/review-pr-feedback": 895,
17294
17294
  "review/review-regression": 216,
@@ -21098,7 +21098,7 @@ var package_default;
21098
21098
  var init_package = __esm(() => {
21099
21099
  package_default = {
21100
21100
  name: "@mrciphersmith/keryx",
21101
- version: "0.3.82",
21101
+ version: "0.3.83",
21102
21102
  description: "Version-controlled project context for AI coding agents: code graph, architecture wiki, project memory, relevant tests, quality signals, and task flows.",
21103
21103
  private: false,
21104
21104
  publishConfig: {
package/dist/core.js CHANGED
@@ -10853,7 +10853,7 @@ var init_skill_length_ceilings = __esm(() => {
10853
10853
  "review/review-jev-scenarios": 187,
10854
10854
  "review/review-layout": 238,
10855
10855
  "review/review-logic": 377,
10856
- "review/review-orchestrator": 1723,
10856
+ "review/review-orchestrator": 1712,
10857
10857
  "review/review-performance": 374,
10858
10858
  "review/review-pr-feedback": 895,
10859
10859
  "review/review-regression": 216,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrciphersmith/keryx",
3
- "version": "0.3.82",
3
+ "version": "0.3.83",
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": {
@@ -1203,25 +1203,25 @@ Ask unless automation settings explicitly set `publish_pr_review_report`:
1203
1203
  ```text
1204
1204
  Publish the review report to the PR?
1205
1205
 
1206
- A) Concise PR comment only
1207
- B) Concise PR comment + detailed AI markdown artifact (recommended for follow-up fixes)
1206
+ A) Concise PR review only
1207
+ B) Concise PR review + detailed AI markdown artifact (recommended for follow-up fixes)
1208
1208
  C) Do not publish
1209
1209
 
1210
1210
  > pick a letter (default: C)
1211
1211
  ```
1212
1212
 
1213
1213
  **Rules:**
1214
- - The PR comment and AI artifact must be written in English only, regardless of the chat language or reviewer output language.
1214
+ - The PR review and AI artifact must be written in English only, regardless of the chat language or reviewer output language.
1215
1215
  - Default is C. Never publish to a PR without explicit user confirmation or `publish_pr_review_report: comment`, `publish_pr_review_report: comment-and-ai-artifact`.
1216
- - If the user chooses A, delegate concise comment formatting to `review-orchestrator`'s PR Review Report Publication contract.
1216
+ - If the user chooses A, delegate concise review formatting to `review-orchestrator`'s PR Review Report Publication contract.
1217
1217
  - If the user chooses B, also generate `.metaproject/jobs/<job-name>/review-ai-report.md` using `review-orchestrator`'s Detailed AI Markdown Artifact contract, and include in the comment's `Meta` section both an `AI artifact` path and an `AI artifact description` row explaining that the file carries detailed findings, fix guidance, patch guidance, regression coverage, validation plan, and follow-up agent context.
1218
1218
  - **If no PR exists yet**, do not ask now and do not stash a pending decision — nothing persists one. Ask this question again after the PR step (2.10) creates the PR, when the answer can actually be acted on.
1219
1219
  - The decision is acted on immediately or not at all. There is no `publication_plan` field in `state.json`; what was published is stated in the 2.9 report.
1220
1220
 
1221
1221
  **Automation values:**
1222
1222
  - `publish_pr_review_report: ask` -> ask the question above.
1223
- - `publish_pr_review_report: comment` -> publish the concise PR comment only.
1224
- - `publish_pr_review_report: comment-and-ai-artifact` -> publish the concise PR comment and create the detailed AI markdown artifact.
1223
+ - `publish_pr_review_report: comment` -> publish the concise PR review only.
1224
+ - `publish_pr_review_report: comment-and-ai-artifact` -> publish the concise PR review and create the detailed AI markdown artifact.
1225
1225
  - `publish_pr_review_report: none` -> do not publish.
1226
1226
 
1227
1227
  #### 2.6.3 Post-Review Checkpoint
@@ -1564,15 +1564,18 @@ in `templates/review-report.md`: `Changes requested` or `No blockers, merge-read
1564
1564
  Render the human report from that file. Do not invent a second skeleton here.
1565
1565
 
1566
1566
  ```markdown
1567
- **Changes requested — 1 Blocker, 2 Major, 4 Minor, 1 question.** Reviewed `<head>` against `<base>` (round N). <what holds, and where the risk is.>
1567
+ <!-- slot:pre-verdict -->
1568
+ **Changes requested — 1 Blocker, 2 Major, 4 Minor, 1 question.** <what holds, and where the risk is.>
1569
+ Reviewed `<head>` against `<base>` · round N · <files> files, +<add>/−<del> · CI <state>.
1570
+ <!-- slot:after-verdict -->
1568
1571
 
1569
1572
  ### Blocker
1570
- **F-001. <one-sentence claim>.** `path/to/file.ts:line`, in the diff.
1573
+ **F-001. <one-sentence claim>.** [`path/to/file.ts:line`](<blob link at head>), in the diff.
1571
1574
  <proof: traced path, probe, or failing scenario>
1572
1575
  Fix: <concrete>
1573
1576
 
1574
1577
  ### Major
1575
- **F-002. <one-sentence claim>.** `path/to/file.ts:line`, pre-existing — render under Pre-existing instead when location_class says so.
1578
+ **F-002. <one-sentence claim>.** [`path/to/file.ts:line`](<blob link at head>), in the diff.
1576
1579
 
1577
1580
  ### Minor
1578
1581
  - **F-010. <claim>.** `path:line`, in the diff — <proof and fix, one to three sentences>.
@@ -1580,21 +1583,7 @@ Fix: <concrete>
1580
1583
  ### Questions
1581
1584
  1. <an info finding that needs an author answer; other info is not published>
1582
1585
 
1583
- ### Pre-existing (not blocking)
1584
- - **F-020. <claim>.** `path:line` — <why it is out of this diff>
1585
-
1586
- ### Verified clean
1587
- - <what was checked> — <how>
1588
-
1589
- ### How this review was run
1590
- - **Workflow:** `review-orchestrator`
1591
- - **Scope:** `<base>..<head>`, round N, PR #N
1592
- - **Models:** <actual models and reviewers, or not recorded>
1593
- - **Tools:** <tools actually invoked, or not recorded>
1594
- - **Skills:** <skills actually used, or not recorded>
1595
- - **Subagents:** <dispatched reviewers and models, or none when confirmed; otherwise not recorded>
1596
- - **Not run:** <reviewer — reason>
1597
- - **Verification:** <mode>; confirmed N, refuted N, unverifiable N, unverified N
1586
+ <details> Pre-existing (not blocking) · Verified clean <!-- slot:verified-clean --> · How this review was run — **Workflow:**, **Scope:**, **Models:**, **Tools:**, **Skills:**, **Subagents:**, **Not run:**, **Verification:** <!-- slot:how-run --> </details>
1598
1587
  ```
1599
1588
 
1600
1589
  Pick the domain file the same way reviewers are picked: frontend scope, or a
@@ -1650,8 +1639,8 @@ the report exists, unless `publish_pr_review_report` is already set:
1650
1639
  ```text
1651
1640
  Publish this review report to the PR?
1652
1641
 
1653
- A) PR comment only
1654
- B) PR comment + follow-up file (recommended when a fix round will follow)
1642
+ A) PR review only
1643
+ B) PR review + follow-up file (recommended when a fix round will follow)
1655
1644
  C) Do not publish
1656
1645
 
1657
1646
  > pick a letter (default: C)
@@ -1659,15 +1648,15 @@ Publish this review report to the PR?
1659
1648
 
1660
1649
  Automation values, names unchanged:
1661
1650
 
1662
- - `comment` or legacy `true` -> the PR comment only.
1663
- - `comment-and-ai-artifact` -> the PR comment plus the follow-up file.
1651
+ - `comment` or legacy `true` -> the PR review only.
1652
+ - `comment-and-ai-artifact` -> the PR review plus the follow-up file.
1664
1653
  - `none` or legacy `false` -> do not publish.
1665
1654
 
1666
1655
  Default is do not publish. No resolvable PR number means skip and say so.
1667
1656
 
1668
- The comment is the report rendered from `templates/review-report.md`, English, with the domain file chosen above (`templates/pr-comment-frontend.md` / `templates/pr-comment-backend.md`) — never a summary written freehand. It does not use a tool heading, a finding table, or a meta table. It does not carry a co-author line, a `Generated with` trailer, or any sentence that names a vendor or a product as the author. Name the workflow and reviewers that actually ran, with models, tools, skills and subagents. Never identify the operator from `gh auth status`, git config or a credential; do not sign the comment as a person, reviewer or model.
1657
+ The review body is the report rendered from `templates/review-report.md`, English, with the domain file chosen above (`templates/pr-comment-frontend.md` / `templates/pr-comment-backend.md`) — never a summary written freehand. It does not use a tool heading, a finding table, or a meta table. It does not carry a co-author line, a `Generated with` trailer, or any sentence that names a vendor or a product as the author. Name the workflow and reviewers that actually ran, with models, tools, skills and subagents. Never identify the operator from `gh auth status`, git config or a credential; do not sign the review as a person, reviewer or model. A project overlay adds content only through the template's overlay slots.
1669
1658
 
1670
- The follow-up file path and the metadata rules (real model names, Run vs Not run, no `adaptive` in the model slot) live in that same template. Write the body to a temp file and post with `gh pr comment <n> --body-file <file>`.
1659
+ The follow-up file path and the metadata rules (real model names, Run vs Not run, no `adaptive` in the model slot) live in that same template. Write the body to a temp file and post it as one formal review whose state follows *Where it is posted* in the template: `gh pr review <n> --request-changes|--approve|--comment --body-file <file>`. On a merged or closed PR, post it as `gh pr comment <n> --body-file <file>` instead.
1671
1660
 
1672
1661
  **No GitHub write without an approved draft.** Before ANY write — the comment, a thread reply, `keryx review comments reply`, a review — show the user the rendered body and wait for explicit approval of that body.
1673
1662
  Picking A or B above chooses *whether* to publish, not *what*; a comment is public and cannot be unsent. With no user to answer (a dispatched run), do not write: hand the rendered body back to the caller.
@@ -1,15 +1,56 @@
1
1
  # Review report (render)
2
2
 
3
3
  The shape of the report a human reads at the end of a round, and of the PR
4
- comment when one is published. Machine contracts are unchanged: severity stays
4
+ review when one is published. Machine contracts are unchanged: severity stays
5
5
  `blocker | major | minor | info`, the output verdict stays
6
6
  `APPROVE | APPROVE_WITH_SUGGESTIONS | REQUEST_CHANGES`, and the `keryx:findings`
7
- block still rides after the prose. This file says how that record is *shown*.
7
+ block still rides after the prose in the ingested copy. This file says how that
8
+ record is *shown*.
8
9
 
9
10
  Read `templates/pr-comment-frontend.md` or `templates/pr-comment-backend.md`
10
- for the domain checklist. This file is the skeleton both share.
11
+ for the domain checklist. This file is the skeleton both share, and the slots a
12
+ project overlay may fill.
11
13
 
12
- ## How the visible verdict is chosen
14
+ ## Where it is posted
15
+
16
+ On a pull request the report is the **body of one formal review**, so it
17
+ counts as a review and not as a comment stream:
18
+
19
+ | Machine `verdict` | Review state |
20
+ |---|---|
21
+ | `REQUEST_CHANGES` | Request changes, if the reviewer may; on the reviewer's own PR GitHub rejects it, so Comment |
22
+ | `APPROVE` / `APPROVE_WITH_SUGGESTIONS` | Approve, if the reviewer may approve; else Comment |
23
+ | PR already merged or closed | a plain PR comment — a review state no longer gates anything |
24
+
25
+ One report per round, posted once. The `keryx:findings` block is never posted;
26
+ it lives in the copy `keryx review ingest` reads. If the body would exceed
27
+ GitHub's 65,536-character limit, post the visible part and link the follow-up
28
+ file for the rest.
29
+
30
+ ## The skeleton
31
+
32
+ Sections in this order. Omit a heading that has no content. The visible part is
33
+ what a reader must act on; everything else is folded.
34
+
35
+ ```markdown
36
+ <!-- slot:pre-verdict -->
37
+ **Changes requested — 1 Blocker, 2 Major, 4 Minor, 1 question.** <what holds, and where the risk is — one sentence.>
38
+ Reviewed `<head>` against `<base>` · round N · <files> files, +<add>/−<del> · CI <green | red: check names>.
39
+ <!-- slot:after-verdict -->
40
+
41
+ ### Prior findings (fix rounds only)
42
+ ### Blocker
43
+ ### Major
44
+ ### Minor
45
+ ### Questions
46
+
47
+ <details><summary><b>Pre-existing (not blocking)</b></summary> … </details>
48
+ <details><summary><b>Scope</b></summary> … </details> (only when a pr-process note exists)
49
+ <details><summary><b>Verified clean</b></summary> … <!-- slot:verified-clean --> </details>
50
+ <details><summary><b>How this review was run</b></summary> … <!-- slot:how-run --> </details>
51
+ ```
52
+
53
+ ### The verdict line
13
54
 
14
55
  Map the machine verdict, do not invent a fourth one:
15
56
 
@@ -19,60 +60,71 @@ Map the machine verdict, do not invent a fourth one:
19
60
  | `APPROVE` | `**No blockers, merge-ready.**` |
20
61
  | `APPROVE_WITH_SUGGESTIONS` | `**No blockers, merge-ready — N Minor, N questions.**` |
21
62
 
22
- `N` is the count of findings **in the changed code** at that severity. A
23
- `location_class: pre-existing` finding is not in that count and does not flip
24
- the verdict. Omit a zero Blocker count. A question is an `info` finding that
25
- needs an author answer, rendered under Questions, not as a finding.
26
-
27
- Then one sentence: what holds, and where the risk is. Name the commits
28
- reviewed: `Reviewed <head> against <base> (round N).` If head moved during the
29
- round, name the commits not checked.
63
+ `N` counts findings **in the changed code** at that severity. A
64
+ `location_class: pre-existing` finding is not counted and does not flip the
65
+ verdict. Omit a zero count. A question is an `info` finding that needs an
66
+ author answer, rendered under Questions, not as a finding.
30
67
 
31
- ## Section order
32
-
33
- 1. Verdict line.
34
- 2. Blocker, then Major. Omit a heading that has no findings.
35
- 3. Minor.
36
- 4. Questions.
37
- 5. Pre-existing (not blocking). Omit if empty.
38
- 6. Scope — only when a process note exists (`location_class: pr-process`).
39
- 7. Verified clean. Required. Not a list of compliments.
40
- 8. How this review was run.
41
- 9. The `keryx:findings` fence, after the prose, unchanged.
42
-
43
- No `## AI Review Report`, `# AI Review Report`, `## AI Summary`, `## Positive
44
- Notes`, or any heading that names the tool instead of the subject. No
45
- `Generated with`, no bot signature, no co-author trailer. A model name appears
46
- only in **How this review was run**, as the model that ran, never as an author.
68
+ The second line is the context line: head, base, round, size, CI. If head moved
69
+ during the round, add `· unchecked: <commits>`.
47
70
 
48
71
  ## One finding
49
72
 
50
- Blocker and Major, as a paragraph:
73
+ Blocker and Major as a paragraph, visible:
51
74
 
52
75
  ```markdown
53
- **F-012. The guard is not called on the save path.** `src/store.ts:88`, in the diff.
54
- `save()` awaits `api.put` and then writes the form with no `runInAction`. A response that lands after unmount still mutates the store.
76
+ **F-012. The guard is not called on the save path.** [`src/store.ts:88`](https://github.com/<owner>/<repo>/blob/<head>/src/store.ts#L88), in the diff.
77
+ `save()` awaits `api.put` and then writes the form with no `runInAction`. A response that lands after unmount still mutates the store. Probe: <what was run, and what it printed>.
78
+ Also at: `src/other.ts:12`, `src/third.ts:40`.
55
79
  Fix: wrap the write in `runInAction`, and ignore the response when `disposed` is set.
56
80
  ```
57
81
 
58
- Minor, as one list item, proof and fix in one to three sentences:
82
+ Minor as one list item, proof and fix in one to three sentences:
59
83
 
60
84
  ```markdown
61
- - **F-019. Icon button has no accessible name.** `src/Toolbar.tsx:14`, in the diff — the control is an icon with no `aria-label`, so a screen reader announces nothing. Fix: add an `aria-label` from `t()`.
85
+ - **F-019. Icon button has no accessible name.** [`src/Toolbar.tsx:14`](…), in the diff — the control is an icon with no `aria-label`, so a screen reader announces nothing. Fix: add an `aria-label` from `t()`.
62
86
  ```
63
87
 
64
88
  Rules:
65
89
 
66
90
  - Bold first line is the claim, one sentence. Then `file:line` and the location
67
91
  class: `in the diff`, `pre-existing`, or `pr-process`.
68
- - Proof is a traced path, a probe that was run, or a concrete failing scenario.
69
- Not "this looks wrong".
92
+ - `file:line` links to the blob at the **reviewed head SHA**, not to a branch,
93
+ so the link still points at the reviewed line after the author pushes.
94
+ - Proof is a traced path, a probe that was run (with what it printed), or a
95
+ concrete failing scenario. Not "this looks wrong".
96
+ - A class with several sites is one finding with an `Also at:` line, never one
97
+ finding per site.
70
98
  - `Fix:` is concrete. A suggested fix is unchecked code: do not publish a fix
71
- you have not checked the same way you checked the finding.
99
+ you have not checked the same way you checked the finding. A GitHub
100
+ `suggestion` block is allowed only for a fix that was checked.
101
+ - Finding ids (`F-NNN`) are stable across rounds: a re-raised finding keeps its
102
+ id, a new one takes the next free number.
72
103
  - No finding table. A table is allowed only for short cells: ids, `file:line`,
73
104
  counts, statuses, before/after, pass/fail. A cell longer than about ten words
74
105
  is not a table cell.
75
106
 
107
+ When there are more than five Minor findings, wrap the Minor list in
108
+ `<details open><summary><b>Minor (N)</b></summary>` so the page stays scannable.
109
+
110
+ ## Prior findings (fix rounds)
111
+
112
+ On a round with `is_fix_round: true`, the disposition of every prior finding
113
+ comes before the new ones, as a short table:
114
+
115
+ ```markdown
116
+ ### Prior findings
117
+ | Id | Finding | Status | Evidence |
118
+ |---|---|---|---|
119
+ | F-003 | Delete frame dropped on cache miss | closed | probe at `<head>`: handler fires |
120
+ | F-007 | Pending key built by hand | partial | 2 of 4 sites |
121
+ ```
122
+
123
+ Statuses: `closed`, `open`, `partial`, `regressed`, `withdrawn`. A withdrawn
124
+ finding names what made it wrong, in one sentence, and is listed first. A defect
125
+ a fix introduced is a new finding, rendered under its severity with
126
+ `regressed from F-NNN`.
127
+
76
128
  ## Questions and pre-existing
77
129
 
78
130
  `info` is not published as a finding. If it needs an author answer, render it
@@ -88,7 +140,6 @@ One line per check that was actually run and held: what was checked, and how.
88
140
  Do not list a checklist item that was not checked. Do not praise.
89
141
 
90
142
  ```markdown
91
- ### Verified clean
92
143
  - MobX write after `await` — every `await` in the diff is followed by `runInAction` or an early return on `disposed`.
93
144
  - i18n — `t()` appears only in render; no `defaultValue`.
94
145
  ```
@@ -101,7 +152,6 @@ git config, a credential or a PR author. Use `not recorded` when evidence for
101
152
  a tool, skill or model is unavailable; use `none` only when the run proves none.
102
153
 
103
154
  ```markdown
104
- ### How this review was run
105
155
  - **Workflow:** `review-orchestrator`; severity and lanes per the repository review rules, else the canonical rubric in this skill.
106
156
  - **Scope:** `<base>..<head>`, round N, PR #N. Unchecked commits: <list or none>.
107
157
  - **Models:** <actual model names and the reviewers that ran on each; or not recorded>.
@@ -118,7 +168,7 @@ a tool, skill or model is unavailable; use `none` only when the run proves none.
118
168
  - **Reviewed at:** <UTC timestamp>
119
169
  ```
120
170
 
121
- Model rules, unchanged from the old metadata table:
171
+ Model rules:
122
172
 
123
173
  - Name the model that actually ran. Never write `adaptive`, `inherit`,
124
174
  `unsupported`, or `current-session` in the model slot.
@@ -128,17 +178,50 @@ Model rules, unchanged from the old metadata table:
128
178
  - Keep **Run** complete. If Not run is long, group it with counts and notable
129
179
  names; the full list belongs in the follow-up file.
130
180
 
181
+ ## Formatting rules
182
+
183
+ - Lead with the conclusion. Nothing above the verdict except a `pre-verdict`
184
+ slot an overlay fills.
185
+ - Visible part: verdict, context line, prior findings, Blocker, Major, Minor,
186
+ Questions. Everything else is inside `<details>`.
187
+ - Leave a blank line after every `<summary>…</summary>` and before
188
+ `</details>`; GitHub renders the Markdown inside only then.
189
+ - Code, paths, flags and identifiers in backticks. No screenshots of code.
190
+ - No `## AI Review Report`, `# AI Review Report`, `## AI Summary`,
191
+ `## Positive Notes`, or any heading that names the tool instead of the
192
+ subject. No `Generated with`, no bot signature, no co-author trailer. A model
193
+ name appears only in **How this review was run**, as the model that ran,
194
+ never as an author.
195
+
196
+ ## Overlay slots
197
+
198
+ A project overlay (for example a repository facade over this engine) extends the
199
+ report **only** by filling these slots. It may not reorder, rename or remove a
200
+ base section, add a severity level, or change the verdict mapping.
201
+
202
+ | Slot | Where | Typical content |
203
+ |---|---|---|
204
+ | `pre-verdict` | above the verdict line | a scope verdict that comes before severity, e.g. "Mis-scoped: split" |
205
+ | `after-verdict` | right after the context line | round status, round cap, review-state rationale, a table of other reviewers' open items |
206
+ | `verified-clean` | end of Verified clean | the project's mandatory checks, each with how it was checked |
207
+ | `how-run` | end of How this review was run | project orchestrator name, overlays selected and skipped, project packages applied, rule files read |
208
+
209
+ An overlay may also map the review state more strictly (for example "any Major
210
+ → Request changes"), never more loosely than the table in *Where it is posted*.
211
+ An empty slot leaves no trace in the output. The `<!-- slot:… -->` markers are
212
+ rendering guides and are not posted.
213
+
131
214
  ## Follow-up file
132
215
 
133
216
  When publication is `comment-and-ai-artifact`, write the long form beside the
134
- job, not into the PR comment:
217
+ job, not into the PR review:
135
218
 
136
219
  ```text
137
220
  jobs/reviews/pr-<number>/review-report.md
138
221
  .metaproject/jobs/<job-name>/ai/review-report.md
139
222
  ```
140
223
 
141
- Same section order as the comment. YAML front matter may keep the machine
224
+ Same section order as the review. YAML front matter may keep the machine
142
225
  verdict (`APPROVE | APPROVE_WITH_SUGGESTIONS | REQUEST_CHANGES`) because ingest
143
226
  reads it. The visible title is the subject of the change, never a tool name.
144
227
  No co-author line in the file either.