xienda/dsh-jev-verify
0.8.6 fixes a startup crash: the host runtime package is an optional peer, never an installed dependency. TypeSafe Jev (System One decision model) wired end to end into DeepSeek Harness (0.8.6). Seven tools: jev_decision (1-25 parallel atomic verdicts in one call; noul/choice/score; typed answers with calibrated confidence; measured median 266-484 ms; verdicts only, never prose), jev_choose (rank 2-10 candidate approaches - fit 0-3 and risk - into an explicit composite with a recommended pick), jev_batch (NEW in 0.8.6: one set of 1-5 judgments over 1-20 texts, one real call per text at bounded concurrency, returning a paste-ready markdown table sortable by a judged dimension; built-in sentiment/priority/intent/pii/spam presets; a failed row is reported as failed with the raw error, never guessed), jev_usage (locally measured usage: calls, tokens, estimated cost, latency median and p95, per-tool mix, rolling windows, projected burn rate, optional local hard budgets, and a declared-balance remainder), jev_overview (session ledger), jev_guard_status (guard counters plus a registrations block that surfaces per-surface registration failures) and jev_verify (frozen 27-question live benchmark at concurrency 6: 96.3%, 26/27). WHAT IS NEW IN 0.8.6 - the ledger survives a restart, the remainder is derived instead of invented, and the plugin can now do batch paperwork. (1) The local ledger persists to $DSH_HOME/jev-usage.json BY DEFAULT, so the cumulative total no longer resets when the host restarts. Two real bugs behind the old silent zero were found and fixed: the ledger path only honoured DSH_HOME (absent inside the host process, so persistence was silently disabled and the file name was null), and save() wrote the still-empty in-memory ring over the history file because it ran before the first load while the debounce window swallowed the follow-up write. (2) Remaining is derived, never invented: TypeSafe exposes no balance endpoint - /v1/usage, /v1/quota, /v1/account, /v1/account/balance, /v1/balance, /v1/credits, /v1/billing, /v1/me, /v1/limits and a dozen more all return 404, and only /v1/models answers, with no balance headers - so the panel shows the remainder as your declared balance (quota.declaredBalanceUsd) minus locally measured spend since quota.balanceSince, and says plainly that it cannot be fetched instead of printing a number. (3) The composer pill re-reads every 20 s instead of every 60 s, so a call you just made shows up while you are still looking at it. (4) The collapsed pill leads with the remainder once you declare a balance, and the cumulative row is renamed when the ledger is on disk. Every tool has an in-conversation structured view; the Settings > Plugins card covers credentials, tool switches, the auto-guard, the dashboard, the prompt section, usage/quota and auto-triage. Honest by design: no API key means an explicit error, never fabricated results; every registration is quarantined so a failure degrades one surface. Tests 38/38 (npm test, ~2.5 s). Client half applies on refresh; server half needs a host restart.