@mrciphersmith/keryx 0.3.14 → 0.3.16
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
|
@@ -8060,7 +8060,7 @@ function readBundledSkillRouting(category, name) {
|
|
|
8060
8060
|
}
|
|
8061
8061
|
return { description, triggers };
|
|
8062
8062
|
}
|
|
8063
|
-
var BUNDLED_GDSKILLS;
|
|
8063
|
+
var BUNDLED_GDSKILLS, BUNDLED_TREE_MARKER;
|
|
8064
8064
|
var init_catalog = __esm(() => {
|
|
8065
8065
|
BUNDLED_GDSKILLS = [
|
|
8066
8066
|
renderedSkill("metaproject-router", "core", ["minimal", "recommended", "full"], "Choose which Metaproject module, working skill, or project-skill should be used for a user request.", [
|
|
@@ -8556,6 +8556,7 @@ var init_catalog = __esm(() => {
|
|
|
8556
8556
|
"Sync only selected skills and report changed files."
|
|
8557
8557
|
], ["sync skills", "install runtime skills", "global skill sync"], "Use when already-exported runtime skills need pushing to configured local runtimes, and only when sync is explicitly enabled. NOT for: producing the runtime export itself (see skill-runtime-exporter).")
|
|
8558
8558
|
];
|
|
8559
|
+
BUNDLED_TREE_MARKER = path33.join("src", "gdskills", "bundled");
|
|
8559
8560
|
});
|
|
8560
8561
|
|
|
8561
8562
|
// src/gdskills/resolve.ts
|
|
@@ -33819,7 +33820,7 @@ function readJsonl2(file) {
|
|
|
33819
33820
|
out.push({
|
|
33820
33821
|
role: o.role,
|
|
33821
33822
|
content: o.content,
|
|
33822
|
-
...o.provenance === "trusted" || o.provenance === "project" || o.provenance === "model" || o.provenance === "tool" ? { provenance: o.provenance } : {},
|
|
33823
|
+
...o.provenance === "trusted" || o.provenance === "project" || o.provenance === "model" || o.provenance === "tool" || o.provenance === "harness" ? { provenance: o.provenance } : {},
|
|
33823
33824
|
...toolCalls !== undefined ? { toolCalls } : {},
|
|
33824
33825
|
...typeof o.toolCallId === "string" && o.toolCallId.length > 0 ? { toolCallId: o.toolCallId } : {},
|
|
33825
33826
|
...typeof o.ts === "string" && o.ts.length > 0 ? { ts: o.ts } : {},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mrciphersmith/keryx",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.16",
|
|
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": {
|
|
@@ -58,6 +58,10 @@ conditional step never runs, it is `skipped` — never absent.
|
|
|
58
58
|
1. **Publish once, as soon as the plan exists** — after `job-orchestrator`'s 1.1
|
|
59
59
|
plan build, after the Flow's task list exists in Phase 1, after
|
|
60
60
|
`review-orchestrator` fixes its scope and dispatch in Step 6. Not at the end.
|
|
61
|
+
For `review-orchestrator` that is the ONLY publication: nothing before Step 6,
|
|
62
|
+
then all fifteen ids at once — of steps 0–5, the ones that ran are
|
|
63
|
+
`completed` and the ones that did NOT run are `skipped`; steps 6–14 are
|
|
64
|
+
`pending` (or `in_progress` for whichever is starting right now).
|
|
61
65
|
2. **`proposed` for a plan that is awaiting the operator.** Where an orchestrator
|
|
62
66
|
stops to ask — `job-orchestrator` 1.3's "Proceed? (yes / adjust …)" and
|
|
63
67
|
`flow-orchestrator` Phase 4's completion choice — the items are `proposed`
|
|
@@ -72,7 +76,12 @@ conditional step never runs, it is `skipped` — never absent.
|
|
|
72
76
|
operator can see is a moving marker, not a growing list of ticks.
|
|
73
77
|
5. **`blocked` when the run needs the operator** — an approval, a credential, a
|
|
74
78
|
failure that needs a decision.
|
|
75
|
-
6. **`
|
|
79
|
+
6. **`completed` only once the step's artifact exists.** A step that produces
|
|
80
|
+
an artifact is marked `completed` after that artifact exists, not after the
|
|
81
|
+
work was attempted — review steps 8–10 only once `keryx review ingest` has
|
|
82
|
+
recorded their results. A step whose subagent returned nothing usable is
|
|
83
|
+
`blocked`. The plan may lag the work; it must never run ahead of it.
|
|
84
|
+
7. **`plan_get` before a write when a conflict is possible** (a resumed session, a
|
|
76
85
|
second shell on the same checkout) and re-apply against the revision you read.
|
|
77
86
|
|
|
78
87
|
## What the bridge is NOT
|
|
@@ -85,6 +94,9 @@ conditional step never runs, it is `skipped` — never absent.
|
|
|
85
94
|
- Not a completion signal. A plan whose items are all `completed` does not mean
|
|
86
95
|
the job is done: verification, review and the completion report are the
|
|
87
96
|
orchestrator's own gates.
|
|
97
|
+
- Not a turn controller. The plan is display-only: an item left `pending` is
|
|
98
|
+
never a reason to continue a turn, and a fully ticked plan is never a reason
|
|
99
|
+
to end one. The orchestrator's gates and the operator decide that.
|
|
88
100
|
|
|
89
101
|
## Red Flags — stop and re-read this rule if you are thinking:
|
|
90
102
|
|
|
@@ -92,5 +104,7 @@ conditional step never runs, it is `skipped` — never absent.
|
|
|
92
104
|
|---|---|
|
|
93
105
|
| "I'll publish the plan when the work is finished and I know all the statuses" | That is a report, not a plan. The sidebar exists so the operator can watch WHILE it runs — a plan published at the end has nothing to show. |
|
|
94
106
|
| "The ids are mine to choose, as long as the titles match" | Then the session plan and `keryx job status` cannot be reconciled by a human or by a resumed run, and the projection has become a second plan. |
|
|
95
|
-
| "`proposed` is the same as `pending`, I'll just use `pending`" | `pending`
|
|
107
|
+
| "`proposed` is the same as `pending`, I'll just use `pending`" | `pending` reads as actionable work — to the operator, and to the shell's plan follow-through when it is opted in — so the "wait for approval" gate disappears. |
|
|
108
|
+
| "The step ran, so I'll tick it and write the record afterwards" | `completed` means the artifact exists. A plan that ticked steps 8–10 before any ingest is how an unrun review looked finished. |
|
|
109
|
+
| "Items are still `pending`, so I have to keep going" | The plan is display-only. Whether the turn continues is the orchestrator's gate and the operator's call, never the sidebar's. |
|
|
96
110
|
| "Skipping the plan is fine when the job is short" | Then the operator's single progress surface is empty for exactly the runs where watching matters most. |
|
|
@@ -49,7 +49,7 @@ Review Orchestrator Progress:
|
|
|
49
49
|
- [ ] Step 11: Sort by severity, deduplicate, emit unified report
|
|
50
50
|
- [ ] Step 12: Emit the machine-readable `keryx:findings` block alongside the report
|
|
51
51
|
- [ ] Step 13: Report the stage counts: dropped by pre-filter, refuted by the verifier, retained
|
|
52
|
-
- [ ] Step 14: MANAGED rounds only (NEVER in `lightweight`, which is report-only), AFTER THE FINAL ROUND, on an OPEN pull request at the head you reviewed — answer every external comment once, `keryx review comments reply --final` — never against a pull request the dispatch named as the caller's
|
|
52
|
+
- [ ] Step 14: MANAGED rounds only (NEVER in `lightweight`, which is report-only), AFTER THE FINAL ROUND, on an OPEN pull request at the head you reviewed — answer every external comment once, `keryx review comments reply --final` (render with `--dry-run` and get the user's explicit approval first) — never against a pull request the dispatch named as the caller's
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
Step 0 runs on **every** round. Step 14 runs **once**, after the last one. They are
|
|
@@ -64,7 +64,7 @@ already hold (`--scope`, `--findings`, `--diff-lines`, `--fix-attempt`,
|
|
|
64
64
|
`--verifier`, `--security`, `--forced-strategy-change`) and paste the `model`
|
|
65
65
|
block it prints into that dispatch.
|
|
66
66
|
|
|
67
|
-
Do NOT assign the tier by reading the table in `rules/core/model-selection.mdc`. Plan bridge: publish this checklist with `plan_set` under the ids `step-0`…`step-14` and move each item with `plan_update` as its step completes — see the `session-plan-bridge` rule.
|
|
67
|
+
Do NOT assign the tier by reading the table in `rules/core/model-selection.mdc`. Plan bridge: publish this checklist with `plan_set` under the ids `step-0`…`step-14` ONCE, here at Step 6 when scope and dispatch are fixed — never earlier. Publish each of steps 0–5 that ran as `completed`, publish any of steps 0–5 that did NOT run as `skipped`, and publish steps 6–14 as `pending` (or `in_progress` for whichever of them is starting right now) — and from then on move each item with `plan_update` as its step completes — see the `session-plan-bridge` rule. `completed` means the step's artifact exists: steps 8–10 become `completed` (in the plan and in the report) only after `keryx review ingest` has recorded their results, and a step whose reviewers were `BLOCKED` is `blocked`, never `completed`.
|
|
68
68
|
Working it out in your head is exactly the mechanical step that rule moves into
|
|
69
69
|
code — and it is the step that was documented as running for a whole release
|
|
70
70
|
while nothing called it.
|
|
@@ -1157,7 +1157,7 @@ stated intent — an `issue_url`, a task doc, or a PR body.**
|
|
|
1157
1157
|
1. Fetch issue or task requirements.
|
|
1158
1158
|
2. Map changed files and functions to acceptance criteria.
|
|
1159
1159
|
3. Identify any criteria that are not addressed by the diff.
|
|
1160
|
-
4. If there are unimplemented criteria: emit them as `blocker` findings in the final report and note them in `## Blockers`.
|
|
1160
|
+
4. If there are unimplemented criteria: emit them as `blocker` findings in the final report and note them in `## Blockers`. Their `reviewer` is the reviewer that ran the comparison (`review-jev-contract`, or `review-logic` given the spec and the diff) — never `review-orchestrator`: a finding under the orchestrator's name cannot be routed away from its author, so Wave C silently skips it.
|
|
1161
1161
|
5. Continue dispatching the remaining reviewers regardless (spec gaps + quality issues both belong in the report).
|
|
1162
1162
|
|
|
1163
1163
|
### With no issue and no task doc, the PR body is the spec
|
|
@@ -1179,7 +1179,7 @@ that already holds intent and diff side by side is this one.
|
|
|
1179
1179
|
|
|
1180
1180
|
Run it on every round, not only the first. The drift the finding catches is
|
|
1181
1181
|
created BY the rounds: the code moves to answer findings, the body does not, and
|
|
1182
|
-
whoever reads the merge commit a year later reads the body. When `review.jev.contract` is on, dispatch `review-jev-contract --pr` and read its `findings` as this comparison's scored result instead of judging it by eye;
|
|
1182
|
+
whoever reads the merge commit a year later reads the body. When `review.jev.contract` is on, dispatch `review-jev-contract --pr` and read its `findings` as this comparison's scored result instead of judging it by eye; when that opt-in is off, the fallback is `review-logic` dispatched with the spec and the diff, filing under its own name — `SKILL.detail.md` § "CLI-engine reviewers".
|
|
1183
1183
|
|
|
1184
1184
|
---
|
|
1185
1185
|
|
|
@@ -1352,6 +1352,8 @@ Before consolidation, validate every reviewer result:
|
|
|
1352
1352
|
- Findings without evidence are downgraded to `info` or returned to the reviewer for clarification.
|
|
1353
1353
|
- Duplicate findings are merged by `dedupe_key` or by `(file, quote, problem)`.
|
|
1354
1354
|
- `NEEDS_CONTEXT` triggers one targeted context refill. If still unresolved, keep it as an explicit open question, not as a blocker.
|
|
1355
|
+
- **A reply that is not a result is `BLOCKED`.** That covers an empty reply (`(subagent produced no text)`), a reply without a valid `REVIEW_RESULT` block, and a `spawn_subagent` output whose first line is `status: BudgetExhausted (…)` or `status: NoProgress …` — the reviewer was cut short, so whatever fragment it left is not its review. Re-dispatch it exactly once with a larger budget, telling it to return its report before the budget ends (and the same `cwd` when the round reviews a worktree). If that also fails, the pass is **not run**: list it under **Not run** with the reason, and never write its findings yourself — a review nobody ran reported as run is worse than a gap the operator can see.
|
|
1356
|
+
- **The verifier is held to the same rule.** A finding without an applied verifier verdict is `unverified`; the orchestrator never verifies one itself, and a verifier that returned nothing leaves every finding `unverified`, stated in the stage counts.
|
|
1355
1357
|
- If a reviewer exceeds `max_findings`, keep blockers/majors first and summarize lower severity findings.
|
|
1356
1358
|
|
|
1357
1359
|
## Severity (canonical)
|
|
@@ -1600,11 +1602,7 @@ file and must include the wire-contract line.
|
|
|
1600
1602
|
|
|
1601
1603
|
## Stage counts
|
|
1602
1604
|
|
|
1603
|
-
Required in **How this review was run**, copied from `scope.md`, not re-counted
|
|
1604
|
-
by hand. State what each stage removed. Never state it as a precision
|
|
1605
|
-
improvement: no precision baseline exists to improve on. The line carries
|
|
1606
|
-
`verification_mode` (`off | annotate | filter`), confirmed / refuted /
|
|
1607
|
-
unverifiable / unverified, and retained.
|
|
1605
|
+
Required in **How this review was run**, copied from `scope.md`, not re-counted by hand. State what each stage removed. Never state it as a precision improvement: no precision baseline exists to improve on. The line carries `verification_mode` (`off | annotate | filter`), confirmed / refuted / unverifiable / unverified, and retained.
|
|
1608
1606
|
|
|
1609
1607
|
`## Checked and cleared` is now **Verified clean**. Same rule: a hypothesis
|
|
1610
1608
|
that was tested and died, with the evidence, not a list of virtues. There is
|
|
@@ -1665,15 +1663,12 @@ Automation values, names unchanged:
|
|
|
1665
1663
|
|
|
1666
1664
|
Default is do not publish. No resolvable PR number means skip and say so.
|
|
1667
1665
|
|
|
1668
|
-
The comment is the report
|
|
1669
|
-
domain file chosen above. It does not use a tool heading, a finding table, or
|
|
1670
|
-
a meta table. It does not carry a co-author line, a `Generated with` trailer,
|
|
1671
|
-
or any sentence that names a vendor or a product as the author. Say who ran
|
|
1672
|
-
the orchestrator and which reviewers ran; do not sign the comment as them.
|
|
1666
|
+
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. Say who ran the orchestrator and which reviewers ran; do not sign the comment as them.
|
|
1673
1667
|
|
|
1674
|
-
The follow-up file path and the metadata rules (real model names, Run vs Not
|
|
1675
|
-
|
|
1676
|
-
|
|
1668
|
+
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>`.
|
|
1669
|
+
|
|
1670
|
+
**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.
|
|
1671
|
+
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.
|
|
1677
1672
|
|
|
1678
1673
|
Re-read head and the thread immediately before posting. If head moved, re-check
|
|
1679
1674
|
the findings against the new head and name the commits that were not reviewed.
|
|
@@ -1718,6 +1713,11 @@ If absent, proceed normally — context is optional and non-blocking.
|
|
|
1718
1713
|
| "The blast radius came back empty, so nothing can break" | Empty and unresolved are different facts. The graph indexes code — a Markdown or JSON change has no radius at all, and the record says which one you got |
|
|
1719
1714
|
| "The changed files are the same as last round, so scope B can be skipped on the final round" | The final round always recomputes. A fix landed in round 3 is the change; skipping means the certifying round checked the least |
|
|
1720
1715
|
| "This scope-B file has an obvious naming problem, I'll report it" | Rejected in code: a naming problem is `minor` at best, and the floor is `major`. The set is under regression check, not under review — raise it under scope A |
|
|
1716
|
+
| "The reviewer ran out of budget but I saw enough of the diff to write its findings" | Then the report names a review that did not happen. It is `BLOCKED`: one re-dispatch with a larger budget, else **Not run** |
|
|
1717
|
+
| "The verifier returned nothing, so I'll confirm the findings myself" | The orchestrator never verifies. No verdict means `unverified`, stated in the stage counts |
|
|
1718
|
+
| "The spec-gate finding is mine, so `reviewer: review-orchestrator`" | That name makes the finding unroutable in Wave C. File it under the reviewer that ran the comparison |
|
|
1719
|
+
| "Steps 8–10 are done, I'll tick them now and ingest later" | `completed` means the ingest record exists. A plan that runs ahead of the artifacts is how an unrun review looked finished |
|
|
1720
|
+
| "The user said publish, so I can post the comment" | That chose whether, not what. Show the rendered body and get approval of it before any GitHub write |
|
|
1721
1721
|
| "No flags means no reviewers" | No flags → run auto-detection; never produce an empty review |
|
|
1722
1722
|
| "User named a module so I'll use diff mode" | Named module/component/store → path mode; diff mode is only for branch changes |
|
|
1723
1723
|
| "Path mode should only show lines I'd flag in diff mode" | Path mode reviews the entire file — all findings apply, not just added lines |
|