jev-tools-setup 0.3.0__tar.gz

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.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 jev-tools contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,334 @@
1
+ Metadata-Version: 2.4
2
+ Name: jev-tools-setup
3
+ Version: 0.3.0
4
+ Summary: One-command installer for the jev-tools Claude Code plugin: pick the OpenJev (Codiv) API, a local model, or offline mode.
5
+ Author-email: Rcidshacker <ruchitdas36@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/Rcidshacker/jev-tools
8
+ Project-URL: Issues, https://github.com/Rcidshacker/jev-tools/issues
9
+ Project-URL: Changelog, https://github.com/Rcidshacker/jev-tools/blob/main/CHANGELOG.md
10
+ Keywords: claude-code,openjev,codiv,plugin,installer
11
+ Classifier: Environment :: Console
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Requires-Python: >=3.10
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Dynamic: license-file
18
+
19
+ <div align="center">
20
+
21
+ # jev-tools
22
+
23
+ **Let a tiny decision model make the cheap, frequent judgments, so Claude doesn't have to.**
24
+
25
+ A [Claude Code](https://code.claude.com) plugin for the terminal and the desktop app.
26
+ Does this edit break a project rule? Which skill fits this prompt? Which file matters? Does this diff need a careful review?
27
+
28
+ [![PyPI](https://img.shields.io/pypi/v/jev-tools-setup?label=jev-tools-setup)](https://pypi.org/project/jev-tools-setup/)
29
+ ![License MIT](https://img.shields.io/badge/license-MIT-green)
30
+ ![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue)
31
+ ![stdlib only](https://img.shields.io/badge/dependencies-none-lightgrey)
32
+ ![Claude Code plugin](https://img.shields.io/badge/Claude%20Code-plugin-d97757)
33
+ ![shadow-first](https://img.shields.io/badge/ships%20in-shadow%20mode-orange)
34
+
35
+ [Quick start](#-quick-start) · [Choose a backend](#-choose-how-jev-runs) · [What's inside](#-whats-inside) · [Privacy](#-privacy-what-leaves-your-machine) · [Troubleshooting](#-when-something-looks-wrong) · [Reference](#-reference)
36
+
37
+ </div>
38
+
39
+ ---
40
+
41
+ jev-tools asks **OpenJev** ([Codiv](https://codiv.ai) "System One") typed questions (yes/no, pick-one, score) and gets calibrated probabilities back instead of generated text. There is nothing to parse and nothing to hallucinate; your own code applies the thresholds. It runs against the **hosted API**, a **model on your own machine**, or in an **offline** pattern-only mode.
42
+
43
+ > [!IMPORTANT]
44
+ > **Early and shadow-first.** Everything was built and measured against a live Codiv key (numbers in [MEASUREMENTS.md](https://github.com/Rcidshacker/jev-tools/blob/main/docs/MEASUREMENTS.md)), but the samples are small and OpenJev is a young model. The plugin ships in **shadow mode**: hooks only *log* what they would have done. Nothing blocks or injects until you switch to `active`.
45
+ > Independent project, not affiliated with Codiv, OpenJev or TypeSafe AI.
46
+
47
+ Write-up with the numbers, failures and privacy notes: [I built a Claude Code plugin around a model that only answers yes/no](https://dev.to/rcids/i-built-a-claude-code-plugin-around-a-model-that-only-answers-yesno-what-worked-what-failed-1ecj) · feedback welcome in [issue #1](https://github.com/Rcidshacker/jev-tools/issues/1).
48
+
49
+ ## 🚀 Quick start
50
+
51
+ **You need:** Python 3.10+ as the command `python` (the hooks call exactly that), the [`claude` CLI](https://code.claude.com), and [`uv`](https://docs.astral.sh/uv/) or `pipx`.
52
+
53
+ ```bash
54
+ # 1. install the setup tool (once)
55
+ uv tool install jev-tools-setup # or: pipx install jev-tools-setup
56
+
57
+ # 2. optional, read-only: is this machine ready?
58
+ jev-tools-setup check
59
+
60
+ # 3. install the plugin and choose how Jev runs
61
+ jev-tools-setup
62
+ ```
63
+
64
+ Setup installs the skills, scripts and hooks through Claude Code (so **terminal and desktop share one install**), asks which backend you want, validates it, and finishes by writing `~/.jev-tools/LOG.md`. **Restart Claude Code**, then run the `status` skill to confirm everything is wired.
65
+
66
+ > Prefer a one-shot run without installing anything? `uvx jev-tools-setup check` and `uvx jev-tools-setup` work too. To run the latest unreleased code straight from GitHub, use `uvx --from git+https://github.com/Rcidshacker/jev-tools jev-tools-setup`.
67
+
68
+ <details>
69
+ <summary><b>No uv or pipx? Install the plugin by hand</b></summary>
70
+
71
+ Inside Claude Code:
72
+
73
+ ```text
74
+ /plugin marketplace add Rcidshacker/jev-tools
75
+ /plugin install jev-tools@jev-tools
76
+ ```
77
+
78
+ Then give it a key (or a local server) yourself, see [Reference](#-reference). Try it for one session without installing: `claude --plugin-dir /path/to/jev-tools`.
79
+
80
+ </details>
81
+
82
+ ## 🔀 Choose how Jev runs
83
+
84
+ | | **`api`** | **`local`** | **`offline`** |
85
+ |---|---|---|---|
86
+ | **What it is** | Hosted OpenJev at `api.codiv.ai` | A model on your machine | No model, pattern fallbacks |
87
+ | **Best for** | Best accuracy, zero setup beyond a key | Privacy, no key, no quota | Plugin installed but nothing sent anywhere |
88
+ | **Needs** | A free [Codiv key](https://codiv.ai/dashboard) (100M input tokens) | Verdict/Laya: any CPU or GPU. Full OpenJev: NVIDIA Blackwell-class GPU + Docker | Nothing |
89
+ | **Leaves your machine** | Diffs, prompts, rules (see [Privacy](#-privacy-what-leaves-your-machine)) | Nothing (weights download once from Hugging Face) | Nothing |
90
+ | **Model quality** | Full OpenJev (all measurements below) | Verdict and Laya are **small and unmeasured here** | n/a |
91
+
92
+ <details>
93
+ <summary><b>api</b>: paste a key, it is checked and stored safely</summary>
94
+
95
+ Setup asks for your key in a **hidden prompt**, validates it with one live call, and stores it in `~/.jev-tools/credentials` with owner-only permissions (`chmod 600`, or `icacls` on Windows). A rejected key saves nothing. The key is never passed on a command line and never logged.
96
+
97
+ </details>
98
+
99
+ <details>
100
+ <summary><b>local</b>: Verdict 151M, Laya 421M, or the full OpenJev model</summary>
101
+
102
+ Setup asks which model:
103
+
104
+ | Model | Size | Context | Options | Notes |
105
+ |---|---|---|---|---|
106
+ | `verdict-1.4` | 151M | 512 tokens | up to 24 | Smallest. Ignores a yes/no question's `criteria`. Runs on CPU or any GPU |
107
+ | `laya-1.0` | 421M | 1,024 tokens | about 20 | Heavier. Runs on CPU or any GPU |
108
+ | `openjev-latest` | 26B | 65,536 tokens | 255 | Needs an NVIDIA **Blackwell-class** GPU (NVFP4) and Docker ([self-hosting guide](https://codiv.ai/docs/guides/self-hosting)) |
109
+
110
+ For Verdict/Laya, setup shows the plan and the download size, waits for your **yes**, then clones [OpenJev](https://github.com/razorback16/openjev) into `~/.jev-tools`, creates a venv and installs the model's extra (PyTorch comes with it and can be several GB; weights are about 0.6 GB / 1.7 GB as fp32). Start the server in its own terminal and keep it open:
111
+
112
+ ```bash
113
+ jev-tools-setup serve # add --device cpu to force the CPU
114
+ ```
115
+
116
+ **What changes with a small model.** Each question is read with its own copy of the state, cut from the end at the model's window. jev-tools therefore trims long diffs and file excerpts to fit, sends fewer files per `find-files` request, caps option lists (23 for Verdict, 19 for Laya, so `browser-nav` sees fewer elements) and declines a question it cannot shrink. `review-precheck` will mostly say "full review" because its diff is usually cut. **All thresholds and measurements come from the full OpenJev model**, so keep small models in `shadow` and run the `rule-calibrate` skill before switching to `active`.
117
+
118
+ > [!NOTE]
119
+ > The small-model install follows OpenJev's documented steps but is new in 0.3.0 and has not been measured on real projects yet.
120
+
121
+ </details>
122
+
123
+ <details>
124
+ <summary><b>offline</b>: "offline" means no model, not no internet</summary>
125
+
126
+ Nothing is sent anywhere. Deterministic fallbacks still run, and each says what it cannot do:
127
+
128
+ | Piece | Offline behaviour |
129
+ |---|---|
130
+ | `review-precheck` | Regex checks for secrets, dependency files, auth keywords, schema/migration changes, test weakening and swallowed errors. Says "fast" **only** for a small (30 lines or fewer) clean diff |
131
+ | Rule hook | Blocks only a **literal token** that a "never / don't / avoid X" rule forbids (e.g. `console.log`). No judgment |
132
+ | Skill hook | Picks by keyword match |
133
+ | `find-files` | Ranks by keyword count (in our measurements the model was no better, see below) |
134
+ | `browser-nav` | Suggests the element whose name matches the goal, always marked *unsure* |
135
+ | `rule-calibrate` | Unavailable: it needs a model, and says so |
136
+
137
+ These are patterns, not understanding. They miss anything phrased unusually, so keep offline in `shadow`.
138
+
139
+ </details>
140
+
141
+ ## 🧰 What's inside
142
+
143
+ | Piece | Kind | What it does |
144
+ |---|---|---|
145
+ | **Rule hook** `rule_enforcer.py` | `PreToolUse` on `Edit\|Write\|MultiEdit` | Reads your `CLAUDE.md` / `AGENTS.md` rules, asks whether the pending edit breaks one, re-checks any hit with a stricter question, and in `active` mode blocks the write with the rule it broke |
146
+ | **Skill hook** `skill_picker.py` | `UserPromptSubmit` (**opt-in**) | Picks the one installed skill that fits your prompt, confirms it, and in `active` mode adds a one-line pointer to the context |
147
+ | `find-files` | skill | Keyword candidates, then two-stage scoring, prints the most relevant files. A hint, not an oracle |
148
+ | `browser-nav` | skill | Picks each next click from the page's interactive elements; Claude executes and judges pass/fail |
149
+ | `review-precheck` | skill | Seven yes/no policy questions on a git diff decide *fast pass* vs *full review* |
150
+ | `rule-calibrate` | skill | Replays recent commits against your rules: which are decisive, noisy, weak or quiet, *before* you enforce anything |
151
+ | `status` | skill | One screen: backend, key found (by name), mode, hook state, recent events and errors |
152
+ | `report` | skill | Writes the plain-English [`LOG.md`](#-when-something-looks-wrong) |
153
+
154
+ ## ⚙️ How it works
155
+
156
+ ```mermaid
157
+ flowchart LR
158
+ A["Claude Code event<br/>edit · prompt · skill"] --> B["jev-tools script"]
159
+ B --> C{"backend"}
160
+ C -->|api| D["api.codiv.ai"]
161
+ C -->|local| E["Verdict · Laya · OpenJev<br/>127.0.0.1:8080"]
162
+ C -->|offline| F["keyword and pattern<br/>fallbacks"]
163
+ D --> G["typed answers<br/>yes/no · pick · score"]
164
+ E --> G
165
+ G --> H["thresholds in plain code"]
166
+ F --> H
167
+ H --> I{"mode"}
168
+ I -->|shadow| J["log only"]
169
+ I -->|active| K["block or inject"]
170
+ ```
171
+
172
+ Each piece turns a fuzzy judgment into typed questions, sends them with the relevant text as `state` to `POST /v1/systemone`, and applies thresholds in ordinary code. **Every failure path is explicit:** hooks **fail open** (an outage never blocks your edit or prompt) and the review pre-check **fails safe** (an outage routes to full review). Details and the reasoning behind each threshold: [HOW_IT_WORKS.md](https://github.com/Rcidshacker/jev-tools/blob/main/docs/HOW_IT_WORKS.md).
173
+
174
+ ### Modes
175
+
176
+ | Mode | Rule hook | Skill hook |
177
+ |---|---|---|
178
+ | `shadow` (default) | logs the verdict, never blocks | logs the pick, injects nothing |
179
+ | `active` | blocks an edit flagged at ≥ 0.80 **and** confirmed at ≥ 0.70 | injects `Jev skill pick: <name>` (if enabled) |
180
+ | `off` | does nothing, makes no call | does nothing |
181
+
182
+ **Recommended path:** run in `shadow` for a week, read `LOG.md`, run `rule-calibrate` on a project, then switch that setup to `active`. Set the mode with the plugin's `mode` option or `JEV_MODE` (the variable wins).
183
+
184
+ ## 🔒 Privacy: what leaves your machine
185
+
186
+ With the **`api`** backend this plugin sends text to a third party (`api.codiv.ai`). **`local` and `offline` send nothing.** Read this before enabling `api` on any project.
187
+
188
+ | Piece | What is sent (api only) |
189
+ |---|---|
190
+ | Rule hook (every `Edit`/`Write`) | file name, the unified diff (up to 8,000 characters) and the text of your project rules |
191
+ | Skill hook (**opt-in**, every prompt) | your prompt, plus the names and descriptions of your installed skills |
192
+ | `find-files` | the query and short excerpts of candidate files |
193
+ | `review-precheck` / `rule-calibrate` | the git diff (up to 30k characters) / recent commit hunks |
194
+ | `browser-nav` | the goal, the URL and the names of the page's interactive elements |
195
+
196
+ - **Shadow mode still sends.** The hook needs the model's answer to log it. Only `mode: off` sends nothing.
197
+ - **A local seatbelt runs first.** Before sending, these become `[REDACTED]`: private-key blocks, vendor-style keys (`sk-`/`sk_live_`, AWS, Google, GitHub, Slack, npm), JWTs, `Bearer` tokens, credentials in connection strings, assignments to names containing password/secret/token/api key, and long hex or base64-looking strings. Files named like secrets (`.env*`, `*.pem`, `*.key`, `id_rsa*`, `credentials*`, `secrets*` …) are never read into a request. It is a pattern match: a bare token in an unusual shape, **names, emails, customer or employee records and internal business data are not caught**, and about 0.2% of ordinary code lines that mention `token`/`secret` get partly redacted. Risk reduction, not a guarantee.
198
+ - **Retention is unknown to us.** Codiv's public API docs say nothing about how request data is stored or used. Check their terms before sending anything you would not paste into a public forum.
199
+ - **Nothing sensitive is stored locally.** The decision log holds verdicts, probabilities, latency and token counts, never file contents and never the key.
200
+
201
+ Turn it off for one project (regulated, customer, employee or client data) in that project's `.claude/settings.local.json`:
202
+
203
+ ```json
204
+ { "env": { "JEV_MODE": "off" } }
205
+ ```
206
+
207
+ ## 🩺 When something looks wrong
208
+
209
+ `jev-tools-setup` always ends by writing **`~/.jev-tools/LOG.md`**, even when setup fails. Refresh it any time with `jev-tools-setup report`, or run the **`report` skill** inside Claude Code. It merges every decision log (the plugin data directory and `~/.jev-tools`) into plain English:
210
+
211
+ - a one-line **health verdict**: ✅ healthy · ⚠️ notes · ❌ problems
212
+ - your **setup**: backend, model, mode, which variable the key came from (never the key), which logs were read
213
+ - **problems, each with a fix**
214
+ - **what happened**: event counts, median latency, rule checks flagged
215
+ - your **setup history** and the **last 40 events**, one sentence each
216
+
217
+ It contains no API key, file contents or prompts; home paths show as `~` and key-shaped strings are redacted, so it is **safe to attach to an issue**.
218
+
219
+ | Symptom | Likely cause | Fix |
220
+ |---|---|---|
221
+ | Hooks do nothing and nothing is logged | `JEV_MODE=off` (the variable beats the saved mode), or Claude Code was not restarted | Unset `JEV_MODE`, restart Claude Code |
222
+ | `status` says the key is **MISSING** | No key in the environment, plugin option or credentials file | `jev-tools-setup`, choose `api` |
223
+ | 401 / 403 in `LOG.md` | Key rejected | New key at [codiv.ai/dashboard](https://codiv.ai/dashboard), re-run setup |
224
+ | 429 in `LOG.md` | Quota or rate limit (quota errors are not retried) | Wait, or check usage on the dashboard |
225
+ | `python` not found, or opens the Microsoft Store | The hooks call the literal command `python` | Install Python 3.10+; `jev-tools-setup check` tests it |
226
+ | Local server not answering | It is not running, or still loading weights | `jev-tools-setup serve` |
227
+ | Bad edits are never blocked | You are in `shadow` (the default) | Calibrate, then switch to `active` |
228
+ | `review-precheck` always says "full" | Offline backend, a small model cutting the diff, or an outage | `LOG.md` says which |
229
+
230
+ Hooks **fail open**, so a broken install looks identical to a working one until you look at the log. That is exactly what `LOG.md` and the `status` skill are for. To remove everything: `jev-tools-setup uninstall` deletes `~/.jev-tools` (key, config, log); remove the plugin with `/plugin uninstall jev-tools@jev-tools`.
231
+
232
+ ## 📚 Reference
233
+
234
+ <details>
235
+ <summary><b>Giving it a key by hand</b></summary>
236
+
237
+ Any one of these, never in a repo. Lookup order: environment, plugin option, then the setup credentials file.
238
+
239
+ - **Environment variable:** a user-level `OPENJEV_API_KEY`. Windows: `setx OPENJEV_API_KEY "sk-codiv-..."` then restart Claude Code. macOS/Linux: export it in your shell profile.
240
+ - **Plugin option:** Claude Code prompts for the `api_key` setting and stores it as sensitive.
241
+ - **`jev-tools-setup`:** writes the owner-only credentials file for you.
242
+
243
+ Do not put the key in `settings.json`, `CLAUDE.md` or any file in a repo. The client only sends it to `api.codiv.ai` (or loopback), refuses redirects and never logs it. `python scripts/jevlib.py` makes one live call and prints `OK`.
244
+
245
+ </details>
246
+
247
+ <details>
248
+ <summary><b>Environment variables</b></summary>
249
+
250
+ | Variable | Default | Meaning |
251
+ |---|---|---|
252
+ | `OPENJEV_API_KEY` | none | API key (also `TYPESAFE_API_KEY`, or the plugin's `api_key` option) |
253
+ | `OPENJEV_BASE_URL` | `https://api.codiv.ai` | Must be `api.codiv.ai` or loopback |
254
+ | `JEV_MODE` | `shadow` | `shadow`, `active` or `off`; overrides the saved mode |
255
+ | `JEV_SKILL_PICKER` | off | `1` enables the skill hook (also the `skill_picker` option) |
256
+ | `JEV_THRESHOLD` | `0.80` | Rule-violation probability that can block |
257
+ | `JEV_CONFIRM` | `0.70` | Second-look probability required to block |
258
+ | `JEV_SKILL_MIN` | `0.60` | Minimum probability to inject a skill pick |
259
+ | `JEV_PRECHECK_MIN` | `0.25` | Yes-probability that flags a diff for full review |
260
+ | `JEV_LOG` | plugin data dir | Where decisions are appended (JSONL) |
261
+
262
+ </details>
263
+
264
+ <details>
265
+ <summary><b>Files jev-tools writes</b></summary>
266
+
267
+ | File | Holds |
268
+ |---|---|
269
+ | `~/.jev-tools/config.json` | `backend`, `model`, `base_url` (local only), `mode` |
270
+ | `~/.jev-tools/credentials` | your API key, owner-only |
271
+ | `~/.jev-tools/log.jsonl` and the plugin data dir's `log.jsonl` | one JSON line per decision: verdict, probability, latency, token counts |
272
+ | `~/.jev-tools/LOG.md` | the plain-English report built from the logs |
273
+ | `~/.jev-tools/openjev`, `~/.jev-tools/venv` | local small-model install |
274
+
275
+ </details>
276
+
277
+ <details>
278
+ <summary><b>What we measured</b> (full OpenJev, small samples, live against Codiv)</summary>
279
+
280
+ All reproducible from the scripts; method and caveats in [MEASUREMENTS.md](https://github.com/Rcidshacker/jev-tools/blob/main/docs/MEASUREMENTS.md).
281
+
282
+ | Component | Result |
283
+ |---|---|
284
+ | Rule enforcer | 4 of 4 planted violations blocked, 4 of 4 clean edits allowed after the second-look check was added; also blocked and allowed correctly inside real headless Claude Code sessions |
285
+ | Skill picker | 3 of 3 correct on a large real skill roster (two matches, one correct "none") |
286
+ | Review pre-check | benign rename routed *fast*; a diff with a hardcoded key, swallowed exception and emptied tests routed *full* with the right flags |
287
+ | Browser navigator | 5 of 5 steps correct on a synthetic login flow (never run against a real browser) |
288
+ | File discovery | **no better than plain keyword counting** on 8 labelled queries (top-3 hits 4 to 6 of 8 vs 4 of 8); repeat runs differ by up to 2 |
289
+ | Cost and speed | about 1 s per prompt or edit, 2 s when a violation is confirmed; about 5k input tokens per edit at 20 rules |
290
+
291
+ Not measured: the small local models (Verdict, Laya) and the offline fallbacks on real projects.
292
+
293
+ </details>
294
+
295
+ <details>
296
+ <summary><b>Repository layout</b></summary>
297
+
298
+ ```text
299
+ .claude-plugin/plugin.json plugin manifest and user settings (api_key, mode, skill_picker)
300
+ .claude-plugin/marketplace.json single-plugin marketplace so /plugin marketplace add works
301
+ installer/jev_tools_cli.py the jev-tools-setup command (setup, check, serve, report, uninstall)
302
+ installer/jev_report.py builds LOG.md (also run by the report skill)
303
+ hooks/hooks.json the two hooks
304
+ scripts/ jevlib.py (client) and one script per piece, review_policy.json
305
+ skills/<name>/SKILL.md six skills
306
+ tests/test_all.py offline suite against a local mock of /v1/systemone
307
+ docs/ how it works, measurements, build log, Codiv API notes
308
+ pyproject.toml packages the installer as jev-tools-setup
309
+ ```
310
+
311
+ </details>
312
+
313
+ ## 🛠️ Development
314
+
315
+ ```bash
316
+ python tests/test_all.py # offline suite, no network, no key needed
317
+ python scripts/jevlib.py # one live call, needs OPENJEV_API_KEY
318
+ uv build # builds the jev-tools-setup wheel and sdist
319
+ # releases: publishing a GitHub release runs .github/workflows/publish.yml (PyPI trusted publishing, no token)
320
+ ```
321
+
322
+ The tests spin up a local server that mimics `/v1/systemone`, so they prove the logic and the wire format, not OpenJev's accuracy. Accuracy claims come only from the live runs recorded in the docs. See the [CHANGELOG](https://github.com/Rcidshacker/jev-tools/blob/main/CHANGELOG.md) for what changed in each version.
323
+
324
+ ## 🙏 Credits
325
+
326
+ Ideas and hard-won numbers borrowed, with thanks, from projects that got there first (exactly what was taken from each: [BUILD_LOG.md](https://github.com/Rcidshacker/jev-tools/blob/main/docs/BUILD_LOG.md)):
327
+ [abide](https://github.com/coldteadotai/abide) (rule compilation, calibration verdicts, second look) ·
328
+ [hermes-jev-skills](https://github.com/kerpopule/hermes-jev-skills) (confidence floor, two-stage retrieval) ·
329
+ [jev-kit](https://github.com/jonathanavis96/jev-kit) (shadow-first rollout) ·
330
+ [jevgate](https://github.com/Tech-Byte-Frontier/jevgate) (confirming before acting) ·
331
+ [jev-skill-router](https://github.com/shimo4228/jev-skill-router) (plugin layout, honest field report on skill routing).
332
+ The small local models are [Verdict](https://github.com/Heman10x-NGU/Verdict-open-jev) by Heman10x and [Laya](https://github.com/NandhaKishorM/laya) by Nandakishor M / Convai Innovations, served by [OpenJev](https://github.com/razorback16/openjev).
333
+
334
+ Built with [Claude Code](https://claude.com/claude-code). MIT licensed, see [LICENSE](https://github.com/Rcidshacker/jev-tools/blob/main/LICENSE).