@mrciphersmith/keryx 0.3.6 → 0.3.7
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/README.md +47 -0
- package/dist/cli.js +2243 -860
- package/dist/core.js +22 -3
- package/package.json +1 -1
- package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.md +19 -26
- package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +6 -6
- package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +4 -7
- package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +2 -4
- package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.detail.md +23 -0
- package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +17 -17
package/dist/core.js
CHANGED
|
@@ -8599,15 +8599,15 @@ var CEILINGS_BY_KEY, SKILL_LENGTH_CEILINGS;
|
|
|
8599
8599
|
var init_skill_length_ceilings = __esm(() => {
|
|
8600
8600
|
CEILINGS_BY_KEY = {
|
|
8601
8601
|
"core/reviewer-skill-creator": 280,
|
|
8602
|
-
"orchestration/code-verifier":
|
|
8602
|
+
"orchestration/code-verifier": 339,
|
|
8603
8603
|
"orchestration/context-collector": 671,
|
|
8604
8604
|
"orchestration/feature-analyzer": 447,
|
|
8605
8605
|
"orchestration/feature-dev": 177,
|
|
8606
8606
|
"orchestration/flow-orchestrator": 696,
|
|
8607
8607
|
"orchestration/issue-analyzer": 373,
|
|
8608
8608
|
"orchestration/job-documenter": 414,
|
|
8609
|
-
"orchestration/job-orchestrator":
|
|
8610
|
-
"orchestration/task-implementer":
|
|
8609
|
+
"orchestration/job-orchestrator": 2243,
|
|
8610
|
+
"orchestration/task-implementer": 668,
|
|
8611
8611
|
"planning/autodoc-analyst": 180,
|
|
8612
8612
|
"planning/autodoc-architect": 179,
|
|
8613
8613
|
"planning/autodoc-assembler": 145,
|
|
@@ -11183,6 +11183,11 @@ var init_rules_export = __esm(() => {
|
|
|
11183
11183
|
init_registry();
|
|
11184
11184
|
});
|
|
11185
11185
|
|
|
11186
|
+
// src/integrations/jev-edit-guard-surface.ts
|
|
11187
|
+
var init_jev_edit_guard_surface = __esm(() => {
|
|
11188
|
+
init_settings_json();
|
|
11189
|
+
});
|
|
11190
|
+
|
|
11186
11191
|
// src/integrations/service.ts
|
|
11187
11192
|
var init_service = __esm(() => {
|
|
11188
11193
|
init_registry();
|
|
@@ -11191,6 +11196,7 @@ var init_service = __esm(() => {
|
|
|
11191
11196
|
init_codecs();
|
|
11192
11197
|
init_surfaces();
|
|
11193
11198
|
init_rules_export();
|
|
11199
|
+
init_jev_edit_guard_surface();
|
|
11194
11200
|
init_surfaces_w5b();
|
|
11195
11201
|
init_surfaces_learning();
|
|
11196
11202
|
init_markdown_block();
|
|
@@ -23371,6 +23377,7 @@ var exports_service3 = {};
|
|
|
23371
23377
|
__export(exports_service3, {
|
|
23372
23378
|
AC_CHECK_TOKEN_BUDGET: () => AC_CHECK_TOKEN_BUDGET,
|
|
23373
23379
|
CONFIRMATION_CAVEAT: () => CONFIRMATION_CAVEAT,
|
|
23380
|
+
REVIEW_GATE_CONFIG_PATH: () => REVIEW_GATE_CONFIG_PATH,
|
|
23374
23381
|
acCheckCacheKey: () => acCheckCacheKey,
|
|
23375
23382
|
acCheckCachePath: () => acCheckCachePath,
|
|
23376
23383
|
acCriterionKnown: () => acCriterionKnown,
|
|
@@ -37245,6 +37252,18 @@ var HELP_GROUPS = [
|
|
|
37245
37252
|
group: "Managed work",
|
|
37246
37253
|
summary: "Opt-in routing classifier: each request runs on its routing category's model \u2014 /route [on|off]."
|
|
37247
37254
|
},
|
|
37255
|
+
{
|
|
37256
|
+
kind: "slash",
|
|
37257
|
+
name: "/editguard",
|
|
37258
|
+
group: "Managed work",
|
|
37259
|
+
summary: "Jev EDIT GUARD status, threshold and recent flags for the Claude Code PostToolUse hook, with a toggle."
|
|
37260
|
+
},
|
|
37261
|
+
{
|
|
37262
|
+
kind: "slash",
|
|
37263
|
+
name: "/jevprofile",
|
|
37264
|
+
group: "Managed work",
|
|
37265
|
+
summary: "Every review.jev.* setting next to its measured verdict; toggle one or apply the recommended profile."
|
|
37266
|
+
},
|
|
37248
37267
|
{ kind: "slash", name: "/plan", group: "Managed work", summary: "Toggle read-only mode \u2014 /plan [on|off]." },
|
|
37249
37268
|
{
|
|
37250
37269
|
kind: "slash",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mrciphersmith/keryx",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.7",
|
|
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": {
|
|
@@ -151,6 +151,17 @@ Capture:
|
|
|
151
151
|
- Exit code
|
|
152
152
|
- List of circular chains (if any)
|
|
153
153
|
|
|
154
|
+
**2.4 GitHub CI results (only when the dispatch names a PR or run id):**
|
|
155
|
+
```bash
|
|
156
|
+
gh pr checks <pr> --json name,state,link # or use the run id already given
|
|
157
|
+
```
|
|
158
|
+
For each failed check, when `review.jev.ci_triage` is on, run `keryx review
|
|
159
|
+
ci-triage --run <id> --json` before filing it as a finding — `real-regression`
|
|
160
|
+
files CRITICAL as usual; `flaky`/`deterministic` files INFO, "likely flaky —
|
|
161
|
+
rerun before treating as a defect"; `infra` files INFO, "infra failure, not a
|
|
162
|
+
code defect." Every red check still appears; only severity and note change.
|
|
163
|
+
Setting off → file CRITICAL as before, no Jev call.
|
|
164
|
+
|
|
154
165
|
---
|
|
155
166
|
|
|
156
167
|
### Phase 3: ANALYZE
|
|
@@ -259,26 +270,13 @@ STATUS: BLOCKED — could not run checks (missing tooling, wrong directory
|
|
|
259
270
|
|
|
260
271
|
## Integration with job-orchestrator
|
|
261
272
|
|
|
262
|
-
The orchestrator dispatches `code-verifier` at two points
|
|
263
|
-
|
|
264
|
-
**After task-implementer wave (pre-review gate):**
|
|
265
|
-
```
|
|
266
|
-
code-verifier:
|
|
267
|
-
codebase_path: <worktree_path>
|
|
268
|
-
scope: changed
|
|
269
|
-
base_branch: <base_branch from JOB_STATE>
|
|
270
|
-
→ If gate: FAIL → dispatch fix tasks → re-run code-verifier
|
|
271
|
-
→ If gate: PASS → proceed to review
|
|
272
|
-
```
|
|
273
|
+
The orchestrator dispatches `code-verifier` at two points, always with
|
|
274
|
+
`codebase_path: <worktree_path>` and `scope: changed`:
|
|
273
275
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
scope: changed
|
|
279
|
-
→ If gate still FAIL after 3 iterations → report as BLOCKED, skip to report
|
|
280
|
-
→ If gate: PASS → proceed to report
|
|
281
|
-
```
|
|
276
|
+
| Dispatch point | Extra input | On FAIL | On PASS |
|
|
277
|
+
|---|---|---|---|
|
|
278
|
+
| After task-implementer wave (pre-review gate) | `base_branch` from JOB_STATE | dispatch fix tasks, re-run | proceed to review |
|
|
279
|
+
| After fix iterations (post-fix gate) | — | after 3 iterations: report BLOCKED, skip to report | proceed to report |
|
|
282
280
|
|
|
283
281
|
**The orchestrator's internal "checks" step (2.8) is replaced by `code-verifier` dispatch.**
|
|
284
282
|
|
|
@@ -287,14 +285,9 @@ code-verifier:
|
|
|
287
285
|
## Standalone Usage
|
|
288
286
|
|
|
289
287
|
```bash
|
|
290
|
-
#
|
|
291
|
-
/code-verifier
|
|
292
|
-
|
|
293
|
-
# Run on specific project
|
|
288
|
+
/code-verifier # current directory, changed files only
|
|
294
289
|
/code-verifier --path /path/to/project
|
|
295
|
-
|
|
296
|
-
# Full project scan (not just changed files)
|
|
297
|
-
/code-verifier --scope full
|
|
290
|
+
/code-verifier --scope full # full project scan
|
|
298
291
|
```
|
|
299
292
|
|
|
300
293
|
---
|
|
@@ -26,13 +26,9 @@ license: "MIT"
|
|
|
26
26
|
Flow Orchestrator is the Task Manager-aware implementation orchestrator. Plan bridge: publish the tasks with `plan_set` under the ids `T1`…`Tn`, mirror each `keryx flow task done` with `plan_update`, and publish Phase 4's completion choice as `proposed` — see the `session-plan-bridge` rule.
|
|
27
27
|
It wraps the existing gdskills pipeline with `keryx flow` state.
|
|
28
28
|
|
|
29
|
-
Use this skill instead of `job-orchestrator` when the user wants a managed
|
|
30
|
-
story/issue lifecycle with frozen acceptance criteria, task state, an explicit
|
|
31
|
-
completion choice, Code Health, and a durable flow package in
|
|
32
|
-
`.metaproject/flows/`.
|
|
29
|
+
Use this skill instead of `job-orchestrator` when the user wants a managed story/issue lifecycle with frozen acceptance criteria, task state, an explicit completion choice, Code Health, and a durable flow package in `.metaproject/flows/`.
|
|
33
30
|
|
|
34
|
-
Do not modify `job-orchestrator` or `task-implementer` behavior. They remain
|
|
35
|
-
usable without Task Manager. This skill coordinates them through flow state.
|
|
31
|
+
Do not modify `job-orchestrator` or `task-implementer` behavior. They remain usable without Task Manager. This skill coordinates them through flow state.
|
|
36
32
|
|
|
37
33
|
## Hard Preconditions
|
|
38
34
|
|
|
@@ -311,6 +307,8 @@ Recommended worker routing:
|
|
|
311
307
|
| `review` | `review-orchestrator` |
|
|
312
308
|
| `docs` | `job-documenter`, `prd-creator`, or documentation-specific project skill |
|
|
313
309
|
|
|
310
|
+
**Before the first `task-implementer` dispatch of the run:** when `review.jev.edit_guard` is on (`.metaproject/tasks.config.json`), confirm the guard is active — `keryx review jev-edit-guard status`, else `keryx review jev-edit-guard install` — and say why in one line.
|
|
311
|
+
|
|
314
312
|
### Worker communication is schema-governed
|
|
315
313
|
|
|
316
314
|
Workers do not inherit session state; every dispatch is constructed explicitly
|
|
@@ -546,6 +544,8 @@ the bound plus an escalation — never an unbounded loop.
|
|
|
546
544
|
2. If findings or required check failures remain, create or update a flow fix
|
|
547
545
|
task, dispatch `task-implementer`, push the fix, and run review again.
|
|
548
546
|
|
|
547
|
+
**A required check failure is not automatically a fix task.** When `review.jev.ci_triage` is on, run `keryx review ci-triage --run <id> --json` on each failed run first: `top: flaky` (or a `deterministic` override) → rerun once (`gh run rerun --failed <id>`), record it in `journal.md`, and treat a second failure as `real-regression` regardless; `top: real-regression` → investigate and fix as usual; `top: infra` → report it in the completion notes and leave the code alone. The verdict is advisory only — never the sole reason to skip a fix task.
|
|
548
|
+
|
|
549
549
|
**The threshold is `minor`.** The loop exits when the round reports zero
|
|
550
550
|
findings at `blocker`, `major` or `minor`; `info` does not hold it. State the
|
|
551
551
|
remaining `info` findings in the completion report rather than fixing them
|
|
@@ -799,6 +799,8 @@ Task({
|
|
|
799
799
|
})
|
|
800
800
|
```
|
|
801
801
|
|
|
802
|
+
**Before this wave's first task-implementer dispatch:** when `review.jev.edit_guard` is on (`.metaproject/tasks.config.json`), confirm the guard is active — `keryx review jev-edit-guard status`, else `keryx review jev-edit-guard install` — and say why in one line.
|
|
803
|
+
|
|
802
804
|
#### task-implementer dispatch (Step B)
|
|
803
805
|
|
|
804
806
|
```
|
|
@@ -2024,6 +2026,7 @@ Each step failure is classified into one of three classes with different recover
|
|
|
2024
2026
|
| All reviewers fail | `recoverable` | Record the round as failed with a reason, add a warning to the report, continue to VERIFY (2.8) |
|
|
2025
2027
|
| Fix loop exceeds max_review_iterations | `recoverable` | Disposition every surviving finding, log which ended the loop, continue to VERIFY (2.8) |
|
|
2026
2028
|
| Final checks fail | `recoverable` | Include in report, still propose PR (user decides) |
|
|
2029
|
+
| A GitHub CI check on the PR fails | `recoverable` | When `review.jev.ci_triage` is on, run `keryx review ci-triage --run <id> --json` before reporting it as a defect: `flaky`/`deterministic` → rerun once and note it in the report, a second failure counts as `real-regression`; `real-regression` → treat as a real failure; `infra` → report it, don't touch code. Verdict is advisory only. |
|
|
2027
2030
|
| gh CLI not available | `recoverable` | Print PR data, user creates manually. `keryx review comments` needs it too — say so rather than reporting `0 outstanding`. |
|
|
2028
2031
|
|
|
2029
2032
|
### Retry Protocol (for `retryable` errors)
|
|
@@ -2041,13 +2044,7 @@ attempt 1: keryx job step <job-name> <step-id> --status in-progress
|
|
|
2041
2044
|
**Critical:** on retry, re-send the **same prompt** — hold it for the duration of the
|
|
2042
2045
|
step and re-send it verbatim. Never re-derive it; re-derivation causes drift.
|
|
2043
2046
|
|
|
2044
|
-
The prompt itself is **not** persisted: `keryx job` writes no `step.prompt` and no
|
|
2045
|
-
prompt size, so do not instruct a resuming session to read one. What *is* persisted is
|
|
2046
|
-
that the attempt happened — `metrics.steps[].retries`, incremented every time the step
|
|
2047
|
-
re-enters `in_progress`, and the `--reason` line in `journal.md`. A resumed session
|
|
2048
|
-
therefore knows how many attempts a step has had, which is the fact the retry budget
|
|
2049
|
-
needs, and reconstructs the prompt from the plan and the analysis exactly as the first
|
|
2050
|
-
attempt did.
|
|
2047
|
+
The prompt itself is **not** persisted: `keryx job` writes no `step.prompt` and no prompt size, so do not instruct a resuming session to read one. What *is* persisted is that the attempt happened — `metrics.steps[].retries`, incremented every time the step re-enters `in_progress`, and the `--reason` line in `journal.md`. A resumed session therefore knows how many attempts a step has had, which is the fact the retry budget needs, and reconstructs the prompt from the plan and the analysis exactly as the first attempt did.
|
|
2051
2048
|
|
|
2052
2049
|
---
|
|
2053
2050
|
|
|
@@ -546,10 +546,8 @@ second copy of a schema is how that happens.
|
|
|
546
546
|
7. **DO** use `runInAction()` after every `await` in MobX actions.
|
|
547
547
|
8. **DO** use conventional commit format when auto-commit is enabled. Reference only a supplied real issue number; omit the issue reference when absent.
|
|
548
548
|
9. **DO** verify your work before reporting.
|
|
549
|
-
10. **DO** make `STATUS: <TOKEN>` the first line of your final message, and put no
|
|
550
|
-
|
|
551
|
-
and records. `parseChildResult` throws on any first line that is not a
|
|
552
|
-
canonical STATUS token.
|
|
549
|
+
10. **DO** make `STATUS: <TOKEN>` the first line of your final message, and put no JSON in the response body. The full JSON result is the file Phase 6.1 writes and records. `parseChildResult` throws on any first line that is not a canonical STATUS token.
|
|
550
|
+
11. **DO** check a `Rule check flagged: <clause id> at <file>:<line> — fix it if it is a real violation.` line against the named clause as soon as it arrives — fix the flagged line if it's real, otherwise continue; never argue with or silently ignore it, and record a false flag as `edit-guard false flag: <clause id> — <why>` in `notes` (Phase 6.1) so `review.jev.edit_guard_threshold` can be tuned.
|
|
553
551
|
|
|
554
552
|
---
|
|
555
553
|
|
|
@@ -94,6 +94,29 @@ dispatch). A future engine-backed reviewer follows the same pattern: gate on
|
|
|
94
94
|
its own opt-in and reachability, dispatch as a command, merge its `--json`
|
|
95
95
|
output the same way.
|
|
96
96
|
|
|
97
|
+
### Measured verdicts (flow 344 — a live benchmark on a large production React/MobX frontend)
|
|
98
|
+
|
|
99
|
+
Gating them on is still a project's own choice; these are RESULTS, not a change to the gates above.
|
|
100
|
+
|
|
101
|
+
| Reviewer | Verdict | Measured |
|
|
102
|
+
|---|---|---|
|
|
103
|
+
| `review-jev-risk` | **Off by default** — measured weaker than a strong model | Top-3 recall 21% vs. "largest diff first" 30%; Sonnet 5 alone: 44%. |
|
|
104
|
+
| `review-jev-contract` | **Off by default** — measured weaker than a strong model | Caught 12.5% of false PR-description claims vs. Sonnet 5's 67.5%. |
|
|
105
|
+
| `review-jev-rules` | **Not useful on top of a strong reviewer** | Dispatched as an EXTRA reviewer beside an already-strong reviewer: +0 findings. |
|
|
106
|
+
| `review-jev-scenarios` | Experimental — not measured | — |
|
|
107
|
+
| `review-jev-docs` | Experimental — not measured | — |
|
|
108
|
+
| `review-jev-comments` | Experimental — not measured | — |
|
|
109
|
+
|
|
110
|
+
By contrast, `keryx review ci-triage` (Step 0b, not a reviewer) and `keryx
|
|
111
|
+
review jev-select` (Step 5c, not a reviewer either) both have a measured case
|
|
112
|
+
FOR them: CI triage cut developer minutes per failure from 30 to 15.4 under an
|
|
113
|
+
explicit cost model (38% vs. 25% flaky/regression/infra accuracy against
|
|
114
|
+
Sonnet 5 reading the same log, p=0.035); reviewer *selection* is the
|
|
115
|
+
unmeasured lever this benchmark named as most promising, which is why
|
|
116
|
+
`jev-select` ships recall-first and fails open rather than waiting for a
|
|
117
|
+
measurement that has not run yet. Full numbers, methodology and the cost
|
|
118
|
+
model: `docs/docs/jev-in-review.md`.
|
|
119
|
+
|
|
97
120
|
## `jev-triage` — advisory annotations, not a reviewer (Step 9b)
|
|
98
121
|
|
|
99
122
|
`review-jev-triage` (flow 340) is a DIFFERENT shape from every CLI-engine
|
|
@@ -32,12 +32,14 @@ unified report sorted by severity. It does not perform any review logic itself.
|
|
|
32
32
|
```
|
|
33
33
|
Review Orchestrator Progress:
|
|
34
34
|
- [ ] Step 0: On a PR target, collect external comments — `keryx review comments collect`
|
|
35
|
+
- [ ] Step 0b: On a PR target whose checks are red, triage each failed run with `keryx review ci-triage --run <id>` (opt-in `review.jev.ci_triage`) — see "CI Triage on Red Checks"
|
|
35
36
|
- [ ] Step 1: Build Review Context Pack — PR metadata AND the PR's own description, scope, rules, context_doc summary, accepted memory, and the cross-repo contracts the diff consumes
|
|
36
37
|
- [ ] Step 2: Detect review mode (diff mode vs. path mode)
|
|
37
38
|
- [ ] Step 3: Build the bounded scope with `keryx review scope` — never by hand
|
|
38
39
|
- [ ] Step 3b: On a deep round, compute scope B with `keryx review blast-radius` — never by browsing — and KEEP the `--json` file; `review ingest --blast-radius <file>` is refused without it
|
|
39
40
|
- [ ] Step 4: Parse flags / auto-detect domain from scope
|
|
40
41
|
- [ ] Step 5: Ask user to confirm optional convention reviewers (legacy/profile reviewers are flag-only, never prompted)
|
|
42
|
+
- [ ] Step 5c: When `review.jev.select` is on, run `keryx review jev-select` over the finalized candidate set and drop its `skip` decisions from Wave A/B — see "Reviewer selection with Jev"
|
|
41
43
|
- [ ] Step 6: Plan sub-agent dispatch and token budgets, and compute each dispatch's model with `keryx review tier` — never by hand
|
|
42
44
|
- [ ] Step 7: Stage 1 gate - spec compliance check (if issue/task provided)
|
|
43
45
|
- [ ] Step 8: Dispatch selected reviewers in PARALLEL with reviewer-input schema
|
|
@@ -411,6 +413,14 @@ The rule is about the other pull request:
|
|
|
411
413
|
|
|
412
414
|
---
|
|
413
415
|
|
|
416
|
+
## CI Triage on Red Checks (Step 0b)
|
|
417
|
+
|
|
418
|
+
Run once per round, on a PR target whose checks are red, before Step 1: for each failed check run, `keryx review ci-triage --run <id>` (flow 306/307) — an existing keryx command, not something this skill re-implements. Gate it exactly the way the command gates itself: skip it — recorded in the report, never silently absent — when `review.jev.ci_triage` is not `true` in `.metaproject/tasks.config.json`, or no Jev/OpenRouter credential is resolvable; either means the command refuses before any read or network call.
|
|
419
|
+
|
|
420
|
+
Read each run's verdict (`flaky` | `regression` | `infra`) into the report: `flaky` suggests a rerun rather than a finding; `regression` means investigate before trusting this round's other findings, since a broken build can hide or mimic a real defect; `infra` is noted and the round continues. Advisory only — a verdict never gates dispatch and is never itself a finding.
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
414
424
|
## Everything written to GitHub is brief
|
|
415
425
|
|
|
416
426
|
One rule, applied to every outward surface: **PR bodies, PR comments, review
|
|
@@ -663,6 +673,8 @@ A **fix round** is any review of work produced to answer earlier findings. Set
|
|
|
663
673
|
`is_fix_round: true` on every reviewer input, and populate `prior_findings` with
|
|
664
674
|
the earlier findings and the disposition the fix claimed for each.
|
|
665
675
|
|
|
676
|
+
**The Jev edit guard is a FIX-phase tool, not a review-round tool.** `keryx review jev-edit-guard` (a separate feature) is the recommended Jev step during the FIX phase itself — run by the author's agent as it applies fixes, before this round re-reviews them. This skill never runs it; it is not part of review-orchestrator's own dispatch.
|
|
677
|
+
|
|
666
678
|
**Nothing refuses a dispatch that omits them.** `reviewer-input.schema.json`
|
|
667
679
|
states the rule and no production TypeScript loads that schema; reviewer
|
|
668
680
|
dispatch is an action the host agent takes, not a `keryx` invocation, so there
|
|
@@ -891,8 +903,6 @@ nothing moved. The final round recomputes whatever the file set did — otherwis
|
|
|
891
903
|
fix introduced in round 3 gets no regression check at all, and the round that
|
|
892
904
|
certifies the flow is the one that checked the least.
|
|
893
905
|
|
|
894
|
-
---
|
|
895
|
-
|
|
896
906
|
### Path Mode
|
|
897
907
|
|
|
898
908
|
When a path or target is named, collect the candidate files:
|
|
@@ -918,8 +928,6 @@ and therefore no context window; the drop list is recorded exactly the same way.
|
|
|
918
928
|
|
|
919
929
|
**Reviewer behavior in path mode:** reviewers check the entire file content — not just added lines. All findings apply to the current state of the code, not only to changes.
|
|
920
930
|
|
|
921
|
-
---
|
|
922
|
-
|
|
923
931
|
### Auto-detection of Reviewers (both modes)
|
|
924
932
|
|
|
925
933
|
When no flag is provided, infer reviewers from the collected file list:
|
|
@@ -1069,6 +1077,10 @@ If the user does not answer and the review is part of an automated `job-orchestr
|
|
|
1069
1077
|
use the job setting `convention_reviewers` (default: `"ask"`; if still unresolved, include all
|
|
1070
1078
|
detected reviewers and record that choice in the review scope).
|
|
1071
1079
|
|
|
1080
|
+
### Reviewer selection with Jev (`jev-select`) — advisory, before dispatch (Step 5c)
|
|
1081
|
+
|
|
1082
|
+
When `review.jev.select` is on, before Wave A/B dispatch: run `keryx review jev-select (--diff <ref>|--pr <n>) --json` over the finalized candidate set (bundled + project reviewers, after every filter above) and drop every reviewer whose `decision` is `skip` from Wave A/B — **never** the Wave A core safety set (`review-logic`, `review-architecture`, `review-security-code`, `review-highload` when selected), which `jev-select` itself never marks `skip`. Record every decision in the report's scope section as `skipped by Jev selection (advisory)`, naming the probability and reason — this lever is UNMEASURED (unlike every CLI-engine reviewer below), so its skips must stay visible enough for a later round to check whether the skipped reviewer's domain surfaced a real finding anyway. It fails open — keeps every candidate — on its own opt-in being off, a missing credential, or any error; never treat a `jev-select` failure as a reason to skip a reviewer.
|
|
1083
|
+
|
|
1072
1084
|
---
|
|
1073
1085
|
|
|
1074
1086
|
## Legacy/Profile Reviewer Auto-Detection
|
|
@@ -1137,8 +1149,6 @@ Multiple flags may be combined: `review --backend --security` dispatches `review
|
|
|
1137
1149
|
This table applies once this skill is running; reaching it is a separate question. The router strips `--`, so `review --style` is the same phrase as `review-style`'s own `style review` trigger and goes straight there — the same destination this table names, and likewise for `--architecture`, `--security` and `--performance`. Only `--all`, `--project-conventions` and `--legacy-profiles` name this orchestrator, which is why they are its triggers.
|
|
1138
1150
|
`--frontend` and `--backend` are the exception: this table fans each out to three reviewers, but a bare `review --frontend` reaches `review-frontend` alone, because `review frontend` and `frontend review` are one phrase to the router and that phrase is the specialist's — two skills may not share a trigger token set (`src/gdskills/catalog-single-source.test.ts`). Ask by name, or use `review --all`, when you want the three-reviewer fan-out; `docs/skills/rejected-skill-changes.md` records the alternatives that were measured and rejected.
|
|
1139
1151
|
|
|
1140
|
-
---
|
|
1141
|
-
|
|
1142
1152
|
## Stage 1 Gate — Spec Compliance
|
|
1143
1153
|
|
|
1144
1154
|
**Run this FIRST, before dispatching quality reviewers, whenever the change has a
|
|
@@ -1178,7 +1188,7 @@ whoever reads the merge commit a year later reads the body. When `review.jev.con
|
|
|
1178
1188
|
Dispatch selected reviewers in parallel when independent. Use waves when token budget is tight or when one reviewer needs another result:
|
|
1179
1189
|
|
|
1180
1190
|
1. Wave A - core correctness/risk reviewers: logic, architecture, security/highload when selected.
|
|
1181
|
-
2. Wave B - domain reviewers: frontend/backend/testing/convention reviewers filtered to relevant files. `review-jev-rules` (flow 330), `review-jev-risk`/`review-jev-scenarios` (flow 332), `review-jev-docs`/`review-jev-comments` (flow 333), `review-jev-contract` (flow 335) also run here, CLI-engine not sub-agent, `"engine": "jev"` in `keryx review reviewers --json`, gated on their own opt-in and a resolvable Jev/OpenRouter credential — `SKILL.detail.md` § "CLI-engine reviewers".
|
|
1191
|
+
2. Wave B - domain reviewers: frontend/backend/testing/convention reviewers filtered to relevant files. `review-jev-rules` (flow 330), `review-jev-risk`/`review-jev-scenarios` (flow 332), `review-jev-docs`/`review-jev-comments` (flow 333), `review-jev-contract` (flow 335) also run here, CLI-engine not sub-agent, `"engine": "jev"` in `keryx review reviewers --json`, gated on their own opt-in and a resolvable Jev/OpenRouter credential — measured verdicts per reviewer (keep off by default, experimental, etc.) in `SKILL.detail.md` § "CLI-engine reviewers".
|
|
1182
1192
|
3. Wave C - **verification**: `review-verifier` over the consolidated findings, when blockers/majors
|
|
1183
1193
|
exist, `--verify` is set, or the PR is high-risk. See below.
|
|
1184
1194
|
|
|
@@ -1333,8 +1343,6 @@ Each reviewer must return a `REVIEW_RESULT` object matching `.metaproject/skills
|
|
|
1333
1343
|
| Shared flow/graph abstraction contracts | NO | `review-flow-graph` |
|
|
1334
1344
|
| Legacy/profile review profiles | NO | `code-ai-review`, `code-learned-review`, `code-style-review`, `code-mobx-store-review` |
|
|
1335
1345
|
|
|
1336
|
-
---
|
|
1337
|
-
|
|
1338
1346
|
## Sub-Agent Report Quality Gate
|
|
1339
1347
|
|
|
1340
1348
|
Before consolidation, validate every reviewer result:
|
|
@@ -1346,8 +1354,6 @@ Before consolidation, validate every reviewer result:
|
|
|
1346
1354
|
- `NEEDS_CONTEXT` triggers one targeted context refill. If still unresolved, keep it as an explicit open question, not as a blocker.
|
|
1347
1355
|
- If a reviewer exceeds `max_findings`, keep blockers/majors first and summarize lower severity findings.
|
|
1348
1356
|
|
|
1349
|
-
---
|
|
1350
|
-
|
|
1351
1357
|
## Severity (canonical)
|
|
1352
1358
|
|
|
1353
1359
|
**This is the only severity rubric in the review domain.** Reviewers do not carry
|
|
@@ -1445,8 +1451,6 @@ inventing a fifth level to express it would put us back where we started.
|
|
|
1445
1451
|
`review-security-code` carries a fourth — every security finding states its attack
|
|
1446
1452
|
vector — which does not generalise and stays there.
|
|
1447
1453
|
|
|
1448
|
-
---
|
|
1449
|
-
|
|
1450
1454
|
## Finding Format
|
|
1451
1455
|
|
|
1452
1456
|
### Class scope — required for `blocker` and `major`
|
|
@@ -1530,8 +1534,6 @@ All findings from all sub-reviewers must be normalized to this format before con
|
|
|
1530
1534
|
|
|
1531
1535
|
Severity ordering for sort: `blocker` > `major` > `minor` > `info`.
|
|
1532
1536
|
|
|
1533
|
-
---
|
|
1534
|
-
|
|
1535
1537
|
### Model Metadata Rules
|
|
1536
1538
|
|
|
1537
1539
|
`adaptive` is a model-assignment outcome recorded when `keryx review tier` printed `inherit: true` and the host picked the model for the tier, not a model name. Never render it as `model: adaptive` or as the PR comment `Model` value.
|
|
@@ -1544,8 +1546,6 @@ When writing review report metadata or a PR comment:
|
|
|
1544
1546
|
5. If the dispatch's `model` block carried `inherit: true`, write `Model assignment: adaptive` and the model the host actually dispatched on for that tier (or `unknown`).
|
|
1545
1547
|
6. If the actual model is unknown, write `unknown`; do not substitute `adaptive` or `inherit`.
|
|
1546
1548
|
|
|
1547
|
-
---
|
|
1548
|
-
|
|
1549
1549
|
## Output Contract
|
|
1550
1550
|
|
|
1551
1551
|
```
|