@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/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": 193,
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.134",
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.16.0",
83
+ "qs": "^6.17.1",
82
84
  "zod": "^4.6.6",
83
- "@hono/node-server": "^1.19.15",
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": "^1.32.1",
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` and run in its sandbox. Without it, use `consumer-trace` or `base-diff`,
75
- or file a question.
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`. It is not rejected: a true claim survives, labelled. A
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
- that re-exports it), from the code graph, under one cap shared by all exports, with
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
- 1. Read the diff against the description. Anything the description calls unchanged
100
- and the diff edits is a `diff-vs-description` candidate.
101
- 2. For each changed shared symbol, read its consumers before the symbol: the
102
- assumption sits at the consumer, and the change moves what the consumer receives.
103
- 3. Compare behaviour, not text. An event, a default, a fallback, an ordering, a
104
- number of times a step runs: show it on head and on base.
105
- 4. Count work per trigger: what runs on each keystroke, render, request.
106
- 5. For each test the change added or leaned on, ask whether it would fail if the
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
- - **Questions**: `info` with `publication: "question"` when you suspect and cannot
115
- show. A question is not a weak finding; it is a different thing to the reader.
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, and each line names
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`; no table here. When dispatched, follow the `reviewer-input.schema.json` payload and return a `REVIEW_RESULT` object compatible with
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
- | "It looks worse, so it is a `major`." | Without an `evidence_kind` the ingest lowers it to `info` and marks it unproven. Show it, or file it as a question. |
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 consumer list is the graph's. A model-chosen set is the sweep that misses the consumer nobody thought of. |
165
- | "The set was capped, but I covered the important ones." | The cap is recorded. If it dropped consumers, say so; a report that implies a full sweep over a truncated set is a false claim about coverage. |
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
- - Anything you could not show is `info`, a question, or pre-existing, not a `major`.
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 -->