@mrciphersmith/keryx 0.3.134 → 0.4.1
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 +232909 -154434
- package/dist/core.js +5 -1
- package/package.json +11 -8
- package/src/gdskills/bundled/skills/review/review-degradation/SKILL.md +33 -35
package/dist/core.js
CHANGED
|
@@ -9739,7 +9739,7 @@ var init_skill_length_ceilings = __esm(() => {
|
|
|
9739
9739
|
"review/review-backend": 361,
|
|
9740
9740
|
"review/review-clean-code": 538,
|
|
9741
9741
|
"review/review-core-boundaries": 158,
|
|
9742
|
-
"review/review-degradation":
|
|
9742
|
+
"review/review-degradation": 191,
|
|
9743
9743
|
"review/review-flow-graph": 183,
|
|
9744
9744
|
"review/review-frontend": 607,
|
|
9745
9745
|
"review/review-frontend-conventions": 206,
|
|
@@ -11981,6 +11981,9 @@ function renderMetaprojectGitignoreBlock() {
|
|
|
11981
11981
|
.metaproject/data/security/raw/**
|
|
11982
11982
|
.metaproject/data/security/artifacts/latest.md
|
|
11983
11983
|
.metaproject/data/security/artifacts/latest.json
|
|
11984
|
+
# The impact-evidence gate's per-session touch state and event log, written on a
|
|
11985
|
+
# session's first edit of each file: per-machine runtime state.
|
|
11986
|
+
.metaproject/data/security/impact-evidence/
|
|
11984
11987
|
# Forgetting/retention runtime state: the auto-sweep stamp is rewritten by the
|
|
11985
11988
|
# gdctx write path on every call, not a project artifact. These lines were added
|
|
11986
11989
|
# to this repository's .gitignore by hand INSIDE the managed block, where the
|
|
@@ -47012,6 +47015,7 @@ var HELP_GROUPS = [
|
|
|
47012
47015
|
group: "Working in keryx shell",
|
|
47013
47016
|
summary: "Games against the model \u2014 /game [seconds] raises the model-turn deadline."
|
|
47014
47017
|
},
|
|
47018
|
+
{ kind: "cli", name: "hub", group: "Project knowledge", summary: "Connect, sync and exchange revisions with the Team Hub prototype." },
|
|
47015
47019
|
{ kind: "cli", name: "gdgraph", group: "Project knowledge", summary: "Build and query the code dependency graph." },
|
|
47016
47020
|
{ kind: "cli", name: "ctx", group: "Project knowledge", summary: "Run compact context commands and save raw output." },
|
|
47017
47021
|
{ kind: "cli", name: "wiki", group: "Project knowledge", summary: "Manage the local project knowledge base." },
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mrciphersmith/keryx",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
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": {
|
|
@@ -40,12 +40,12 @@
|
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"keryx": "bun ./src/cli.ts",
|
|
43
|
-
"build": "bun build ./src/cli.ts --outdir ./dist --target bun --external @modelcontextprotocol/sdk --external web-tree-sitter --external @opentui/core && bun build ./src/core.ts --outdir ./dist --target bun --external @modelcontextprotocol/sdk --external web-tree-sitter --external @opentui/core && bun build ./src/harness/process/sandbox/proxy-worker.ts --outdir ./dist --target bun --external @modelcontextprotocol/sdk --external web-tree-sitter --external @opentui/core",
|
|
43
|
+
"build": "bun scripts/build-hub-web.ts --check && bun build ./src/cli.ts --outdir ./dist --target bun --external @modelcontextprotocol/sdk --external web-tree-sitter --external @opentui/core && bun build ./src/core.ts --outdir ./dist --target bun --external @modelcontextprotocol/sdk --external web-tree-sitter --external @opentui/core && bun build ./src/harness/process/sandbox/proxy-worker.ts --outdir ./dist --target bun --external @modelcontextprotocol/sdk --external web-tree-sitter --external @opentui/core",
|
|
44
44
|
"prepare": "bun run build",
|
|
45
45
|
"typecheck": "tsc --noEmit",
|
|
46
46
|
"typecheck:scripts": "tsc --project tsconfig.scripts.json --noEmit",
|
|
47
47
|
"test": "bun test",
|
|
48
|
-
"test:core": "bun test src/cli src/core src/impact-evidence/ src/shell-source-audits.test.ts src/acp/ src/assets/ src/bundle/ src/capability/ src/commands/ src/contracts/ src/ctx/ src/decisions/ src/eval/ src/flow/ src/forgetting/ src/gdgraph/ src/gdskills/ src/governance/ src/product/ src/health/ src/integrations/ src/job/ src/learning/ src/lib/ src/mcp/ src/memory/ src/metrics/ src/retention/ src/review/ src/rules/ src/sac/ src/security/ src/stack/ src/standard/ src/sync/ src/testing/ src/trigger/ src/wiki/ scripts/",
|
|
48
|
+
"test:core": "bun test src/cli src/core src/impact-evidence/ src/shell-source-audits.test.ts src/acp/ src/assets/ src/bundle/ src/capability/ src/commands/ src/contracts/ src/ctx/ src/decisions/ src/eval/ src/flow/ src/forgetting/ src/gdgraph/ src/gdskills/ src/governance/ src/product/ src/health/ src/hub/ src/integrations/ src/job/ src/learning/ src/lib/ src/mcp/ src/memory/ src/metrics/ src/remote-control/ src/retention/ src/review/ src/rules/ src/sac/ src/security/ src/stack/ src/standard/ src/sync/ src/testing/ src/trigger/ src/wiki/ scripts/",
|
|
49
49
|
"test:client:terminal": "bun test src/tui/ src/commands/shell",
|
|
50
50
|
"test:client:streaming": "bun test src/harness/provider/",
|
|
51
51
|
"test:client:cancel-resume": "bun test src/harness/run/ src/harness/resume/ src/harness/session/ src/session/ src/bus/ src/rewind/ src/remote/ src/docs/ src/commands/sessions",
|
|
@@ -59,7 +59,9 @@
|
|
|
59
59
|
"check:retired-spellings": "bun scripts/check-retired-cli-spellings.ts",
|
|
60
60
|
"baseline:review-precision": "bun scripts/review-precision-baseline.ts",
|
|
61
61
|
"test:guards": "bun test src/lib/config-dir.ast.test.ts src/lib/config-dir.readers.test.ts src/lib/production-graph.test.ts src/harness/policy/profiles.test.ts src/lib/serve-server.test.ts src/gdskills/agent-catalogue-xref.test.ts src/gdskills/enforcement-claims.test.ts",
|
|
62
|
-
"lint": "eslint ."
|
|
62
|
+
"lint": "eslint .",
|
|
63
|
+
"build:hub-web": "bun scripts/build-hub-web.ts",
|
|
64
|
+
"check:hub-web": "bun run --cwd apps/hub-web typecheck && bun run --cwd apps/hub-web lint && bun run --cwd apps/hub-web test && bun scripts/build-hub-web.ts --check"
|
|
63
65
|
},
|
|
64
66
|
"files": [
|
|
65
67
|
"dist",
|
|
@@ -78,15 +80,16 @@
|
|
|
78
80
|
"body-parser": "^2.4.0",
|
|
79
81
|
"ip-address": "^10.7.4",
|
|
80
82
|
"hono": "^4.13.11",
|
|
81
|
-
"qs": "^6.
|
|
83
|
+
"qs": "^6.17.1",
|
|
82
84
|
"zod": "^4.6.6",
|
|
83
|
-
"@hono/node-server": "^1.
|
|
85
|
+
"@hono/node-server": "^2.1.5",
|
|
84
86
|
"protobufjs": "7.6.6",
|
|
85
|
-
"sharp": "0.35.5"
|
|
87
|
+
"sharp": "0.35.5",
|
|
88
|
+
"minimatch": "^11.0.1"
|
|
86
89
|
},
|
|
87
90
|
"dependencies": {},
|
|
88
91
|
"optionalDependencies": {
|
|
89
|
-
"@modelcontextprotocol/sdk": "
|
|
92
|
+
"@modelcontextprotocol/sdk": "1.32.1",
|
|
90
93
|
"@opentui/core": "^0.4.5",
|
|
91
94
|
"web-tree-sitter": "^0.22.6"
|
|
92
95
|
},
|
|
@@ -30,7 +30,6 @@ How this differs from `review-regression`, before anything else:
|
|
|
30
30
|
| Looks at | dependents of the change only | the diff itself plus the importers of each changed shared export's module |
|
|
31
31
|
| Floor | `major`; below it the ingest screen refuses the finding | none: `blocker`, `major`, `minor`, `info` |
|
|
32
32
|
| Set | the blast-radius files, refused in code if outside them | the consumers `keryx gdgraph affected` lists, never chosen by you |
|
|
33
|
-
| Question | does the change break something that worked | is the code worse than on the base, and can you show it |
|
|
34
33
|
|
|
35
34
|
`review-regression` is untouched by this reviewer and keeps its own screen. Do not re-file its findings; do not widen yours into its question.
|
|
36
35
|
|
|
@@ -71,51 +70,54 @@ minor, major or blocker carries one `evidence_kind`, and `evidence` says what yo
|
|
|
71
70
|
| `base-diff` | you read the same path on base and on head and quote both |
|
|
72
71
|
|
|
73
72
|
`probe`, `red-test` and `merge-trace` run code, so they need `allowed_tools` to include
|
|
74
|
-
`run-tests
|
|
75
|
-
|
|
73
|
+
`run-tests`. Without it, `consumer-trace` and `base-diff` are still evidence: a trigger and outcome you
|
|
74
|
+
read in the code is a finding, `major` when a user who reaches it gets a wrong, lost or blocked result.
|
|
75
|
+
A question is for what the code cannot answer (a backend reply, data, timing), not for what you did not run.
|
|
76
76
|
|
|
77
77
|
This is enforced, not requested. `keryx review ingest` lowers a `major` or
|
|
78
78
|
`blocker` of this reviewer that has no `evidence_kind` to `info`, marks it unproven
|
|
79
79
|
and lists it in `scope.md` under `## Degradation evidence screen` with the rule
|
|
80
|
-
`degradation-no-evidence`.
|
|
81
|
-
finding with evidence keeps its severity; findings of other reviewers are not touched.
|
|
82
|
-
Without a way to show it, file `info`, or a question.
|
|
80
|
+
`degradation-no-evidence`. A true claim survives, labelled; other reviewers' findings are not touched.
|
|
83
81
|
|
|
84
82
|
## What you are given
|
|
85
83
|
|
|
86
84
|
- the diff, and the PR description when there is one;
|
|
87
|
-
- the importers of the module that holds each changed shared export (and of a barrel
|
|
88
|
-
|
|
89
|
-
what it dropped. The set is the graph's, not yours: trace those. If the cap
|
|
90
|
-
dropped consumers, say so in your summary; do not imply a complete sweep;
|
|
85
|
+
- the importers of the module that holds each changed shared export (and of a barrel that re-exports it), from the code graph, under one cap shared by all exports, with what it dropped. Trace those first. If the cap dropped consumers, say so in your summary; do not imply a complete sweep.
|
|
86
|
+
Where the graph lists no importers for a changed export (a barrel, a re-export, a file it has no node for), search for the users of the symbol, mark them `search-derived` in `enumeration_method`, and name in the summary the exports the graph could not answer;
|
|
91
87
|
- the flow's frozen acceptance criteria, and the previous round's findings.
|
|
92
88
|
|
|
93
|
-
A change to a file the graph has no node for (a skill, a schema, a config) has no
|
|
94
|
-
computed consumers. That is recorded as unresolved, not as clean; say the set could
|
|
95
|
-
not answer the question.
|
|
96
|
-
|
|
97
89
|
## How to look
|
|
98
90
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
91
|
+
Two passes, in this order. Done when every candidate of the sweep is filed, refuted or placed in a lane with its reason.
|
|
92
|
+
|
|
93
|
+
1. **Sweep**, no severity floor. Read the diff against the description: anything it calls
|
|
94
|
+
unchanged and the diff edits is a `diff-vs-description` candidate. For each changed shared
|
|
95
|
+
symbol, default, stored field, mode or signature, read its consumers before the symbol: the
|
|
96
|
+
assumption sits at the consumer, and the change moves what the consumer receives. When the
|
|
97
|
+
change swaps a mechanism (a native attribute for a custom one, a reset on load for a rule, sync
|
|
98
|
+
for async), list what the old one did implicitly (styling and focus keyed on it, form submit, an
|
|
99
|
+
event default, a reset of dependent fields) and check the new path still does each. Compare
|
|
100
|
+
behaviour, not text (an event, a default, a fallback, an ordering, how many times a step runs):
|
|
101
|
+
show it on head and on base. Count work per trigger (each keystroke, render, request) and what it
|
|
102
|
+
scales with. For each test the change added or leaned on, ask whether it would fail if the
|
|
107
103
|
regression were real.
|
|
104
|
+
2. **Refute** every candidate you would file as `blocker`, `major` or suspicion. Try to prove
|
|
105
|
+
yourself wrong with a `file:line` read: does the base do the same on this path, is there a
|
|
106
|
+
guard upstream or downstream, does a comment, commit or sibling give a reason (law 4), does
|
|
107
|
+
the description name it. Put the attempt in `evidence` ("refute: read a.ts:12, no guard").
|
|
108
|
+
What survives keeps its severity; what falls is dropped or goes to pre-existing.
|
|
108
109
|
|
|
109
110
|
## Output lanes
|
|
110
111
|
|
|
111
112
|
Four lanes, no more:
|
|
112
113
|
|
|
113
114
|
- **Findings**: worse than base, with a class, evidence and `class_scope`.
|
|
114
|
-
- **
|
|
115
|
-
|
|
115
|
+
- **Suspicions**: `info` with `publication: "question"` when the trigger or the outcome sits
|
|
116
|
+
outside the code (a backend reply, data, timing) and you cannot show it. `problem` ends with
|
|
117
|
+
"If true: <major|minor>, <outcome>"; `fix` is "Check: <the one request, test or command that
|
|
118
|
+
settles it>", which the author can run. Without both it is noise, not a suspicion.
|
|
116
119
|
- **Pre-existing**: `location_class: "pre-existing"`. True, not caused by this change, not blocking.
|
|
117
|
-
- **Verified clean**: in `summary`, one line per thing traced,
|
|
118
|
-
what was traced (the symbol, the consumers, the command). Silence must not read as "nothing found".
|
|
120
|
+
- **Verified clean**: in `summary`, one line per thing traced, naming it (the symbol, the consumers, the command).
|
|
119
121
|
|
|
120
122
|
## Class scope: required for `blocker` and `major`
|
|
121
123
|
|
|
@@ -141,7 +143,7 @@ class_scope:
|
|
|
141
143
|
- **Fix**: concrete suggestion
|
|
142
144
|
```
|
|
143
145
|
|
|
144
|
-
Severity comes from **Severity (canonical)** in `review-orchestrator/SKILL.md
|
|
146
|
+
Severity comes from **Severity (canonical)** in `review-orchestrator/SKILL.md` (`blocker` is its four merge-blocking shapes; `major` and `minor` split on the trigger-and-outcome test); no table here. A `diff-vs-description` is `major` at most, `blocker` only when the change it exposes has a blocker shape itself. When dispatched, follow the `reviewer-input.schema.json` payload and return a `REVIEW_RESULT` object compatible with
|
|
145
147
|
`.metaproject/skills/gdskills/review/review-orchestrator/reviewer-finding.schema.json`, then a short summary; `NEEDS_CONTEXT` rather than a guess. On a FIX slice, also return `prior_dispositions: [{id, disposition}]` for every attached finding id.
|
|
146
148
|
|
|
147
149
|
### Shared laws (every reviewer)
|
|
@@ -151,21 +153,17 @@ Severity comes from **Severity (canonical)** in `review-orchestrator/SKILL.md`;
|
|
|
151
153
|
3. **One finding per class, not one per occurrence.** When the same shape appears at several sites, report it once and list every site. Ten findings that are one finding hide the other nine problems.
|
|
152
154
|
4. **A deliberate choice is not a defect until its reason is read and shown wrong.** An explicit override, suppression or exemption, a comment or commit giving a reason, or a sibling doing the same is a decision: read its reason (the comment, `git log -L` or `git blame`, the sibling) before you report it, and report it only when you can show that reason wrong. A project rule is checked against accepted platform practice and its known exceptions before a deviation from it is reported.
|
|
153
155
|
|
|
154
|
-
Severity levels are defined once, in `review-orchestrator/SKILL.md` → **Severity (canonical)**. This reviewer does not restate them: `blocker` is the four merge-blocking shapes named there and nothing else, and the `major`/`minor` boundary is the trigger-and-outcome test.
|
|
155
|
-
|
|
156
156
|
---
|
|
157
157
|
|
|
158
158
|
## Red Flags
|
|
159
159
|
|
|
160
160
|
| Rationalization | Why it is wrong |
|
|
161
161
|
|----------------|-----------------|
|
|
162
|
-
| "
|
|
162
|
+
| "My first read is enough for a `major`." | Pass 2 tries to refute it first: the base, a guard, a stated reason. A `major` without a refutation attempt in `evidence` is not ready. |
|
|
163
163
|
| "This code was already messy, and the change sits next to it." | Worse than the base is the question. Pre-existing goes in its own lane, not in findings. |
|
|
164
|
-
| "I will name the consumers I think matter." | The
|
|
165
|
-
| "
|
|
166
|
-
| "The description says nothing changed, so I will trust it." | Reading the description against the diff is the check. `diff-vs-description` is a class because the two disagree often. |
|
|
164
|
+
| "I will name the consumers I think matter." | The graph's list comes first. A model-chosen set is the sweep that misses the consumer nobody thought of; extra users you find by search are added, labelled `search-derived`. |
|
|
165
|
+
| "I could not run it, so it is a question or a `minor`." | A traced trigger and outcome is a finding without a run, and `major` when a user gets a wrong, lost or blocked result. Ask only what the code cannot answer. |
|
|
167
166
|
| "The new test passes, so the change is covered." | A test that uses the one input that works cannot see the regression. Ask whether it fails when the behaviour is wrong. |
|
|
168
|
-
| "No findings, so I will say nothing about what I looked at." | Silence reads as "nothing found". Every verified-clean line names what was traced. |
|
|
169
167
|
|
|
170
168
|
---
|
|
171
169
|
|
|
@@ -176,7 +174,7 @@ Report done only once all of these hold:
|
|
|
176
174
|
- Every finding has one `degradation_class` and one `evidence_kind`, and `evidence` says what was run or read.
|
|
177
175
|
- Every `blocker` and `major` carries `class_scope` whose `enumeration_method` is the walk over the graph's consumer list.
|
|
178
176
|
- Every consumer in the payload was traced, or the summary says which were not and why, and whether the cap dropped any.
|
|
179
|
-
-
|
|
177
|
+
- Every `major`, `blocker` and suspicion names its refutation attempt; every suspicion has "If true" and "Check".
|
|
180
178
|
- The summary has a verified-clean line for each thing traced without a finding, naming what was traced.
|
|
181
179
|
|
|
182
180
|
<!-- keryx:layers-block:start -->
|