Decision layer changelog¶
Format follows Keep a Changelog; versioning follows Semantic Versioning.
[0.5.1] — 2026-10-29¶
The distribution stops pretending to be on PyPI.
Changed¶
- The package is installed from the repository. There is no PyPI project, so
pip install "jevqueue @ git+https://github.com/iamvazghen/jevqueue.git"is the command, and every document, error message and install hint in the project now says so. The badges and the install one-liners pointed at a package that was never published, which is a broken promise rather than a shortcut. - The PyPI publish workflow is gone. Nothing was ever published, and the plugin does not need an install step to work, so the workflow was removed rather than fixed.
- The license statement is precise. MIT covers everything in the repository. The hosted Jev model is a separately hosted service under TypeSafe's terms, is not distributed here, and no third-party code is vendored.
0.2.0 — 2026-10-27¶
The release that makes the package reachable and runnable. Two of the changes are about reach — it could not be installed, and it could not be found — and one is about depth: a decision model that needs no account.
Added¶
LocalDecisionModel— an offline decision model that answers the same three typed questions with deterministic rules. It implements the sameDecisionModelcontract asJevClient, so it drops into aGovernorwherever the hosted client does, and the whole machinery — the constraint, the verification, the gates — runs with no credential and no network. It is the hand-written-rules baseline described in docs/comparison.md, packaged: not a judgment model, and its confidence is rule-match strength rather than a calibrated probability. See docs/local-decision-model.md.DecisionModel— aProtocolfor the one method the governor needs from a decision model.Governornow accepts it, which is what makes the decision model pluggable.- A LangChain adapter (
adapters/langchain.py) —GovernedChatModel, a chat-model wrapper.bind_toolsbinds to the governed model rather than to the provider, so the governor stays in the loop; a namedtool_choiceis then applied as a provider-level constraint and verified. Tested against a realBaseChatModel. Install with thelangchainextra (jevqueue[langchain]). python -m jevqueue— the demo, with no key, no network and no provider: the provider constrained to the selected tool, a provider that ignores the constraint refused before anything executes, and a destructive tool stopped at the risk gate.- A benchmark harness (
bench/) — a labelled corpus with the expected route written by hand, reporting routing accuracy, the enforced rate, latency percentiles and the path distribution. A published run of the offline baseline is committed atbench/results/local-rules-baseline.json. The point is the harness rather than the number: it is how two decision models get compared on your traffic. - A release workflow with PyPI Trusted Publishing, so publishing would need no stored token. It never ran: the package was never published, and the publish workflow was removed in 0.5.1 when distribution moved to the repository itself.
- A documentation site — MkDocs configuration, a
Pagesworkflow, and a script that generates the site home page from the README so the two cannot drift apart. - An agent skill (
skills/jev-decision-layer-adapter/) — the Host protocol, the four mandatory tests and the two reference implementations, as a recipe an agent can follow. - Issue templates, labels, and a seeded backlog — a bug template built around the turn
rather than the feature, an adapter-request template that asks how the constraint would be
applied, and five
good first issueitems covering LangGraph, CrewAI, AutoGen, a TypeScript client, and OpenTelemetry spans. - docs/ecosystem-submissions.md — ready-to-paste entries for the three Jev ecosystem directories, in each one's own format.
Changed¶
- The package description now leads with the problem it solves rather than the mechanism it uses, and the keyword set covers the terms someone would actually search for.
- The README leads with the two failures this addresses, gains a "Works with" table, a "When not to use it" section, and a keyless quickstart — and says plainly that deferring tool schemas is no longer a differentiator now that Tool Search ships in Claude Code. The durable ground is enforcement and the independent completion gate.
Fixed¶
- The package was never published. CI built a wheel and uploaded it as an artifact, with no
publish job and no release trigger, so
pip install jevqueuefailed with "no matching distribution found" — the README's very first command. The install now names the repository, which is what actually works. - The LangChain and Pydantic AI adapter tests were skipped in CI, because the frameworks were not in the development extras. They are now installed in CI, so both adapters are tested against the real frameworks rather than only by their author.
- The
Hostprotocol was documented as six methods throughout the project. It has seven —interrupted()was added after the count was first written down, and the number was never revised. Corrected in the protocol docstring, the docs, the NOTICE, the adapter issue template and the agent skill.
0.1.0 — 2026-10-08¶
First release. Pre-1.0: the Host protocol and GovernorConfig fields may still change, and
breaking changes will be called out here.
Added¶
Governor— a seven-guard decision loop over one System One call per step. Nine recorded paths (static_tool,tool_arguments,final_response,clarification,risk_stop,delegated,completion_held,truncated_hold,error), each with the probabilities, the resolved model id, and the decision latency behind it.- Enforcement, not advice. The host constrains the provider to the selected tool, and the
result is checked against it — a provider that ignores
tool_choiceraises before anything executes. The inverse also holds: a tool call after afinishdecision is blocked. - An independent completion gate.
goal_metis a separate question in the same request, so it cannot see theactionanswer; afinishbelowcompletion_thresholdis refused. - A truncation hold. A
finishdecided on a partial view of the transcript is refused, because the dropped history is where unfinished work would be. - A risk gate ahead of the confidence gate, so uncertainty about risk never falls through to the generative model.
- A distrust layer (
decision.py): rejects non-finite andboolprobabilities, a distribution over the wrong option set or one that does not sum to one, and a choice that is not its own argmax; clamps reported confidence to the winning option's own mass. - A bounded state projection (
state.py) enforced on serialized length, built fresh per step, which never mutates or reorders the canonical transcript. JevClient/AsyncJevClient— one retry for429/529only, distinguishable401and403diagnoses, injectable transport, and no credential or response body in any exception message.GovernorConfig— validated at construction, with unknown keys an error rather than a warning.static_tools— zero-generative-cost execution for fixed payloads, validated against the tool's live JSON schema, remote$refrefused, and only on alowrisk verdict.- Adapters:
openai_chat(any OpenAI-compatible loop),hermes(a six-line seam),pydantic_ai(GovernedModel, aWrapperModelthat constrains viafunction_toolsandallow_text_output), andopenclaw(OpenClawRouter— fleet routing withargv-only dispatch, the message in a file, no--deliver, and an environment allowlist built from nothing). - 210 hermetic tests — no network, no API key, no provider.
scripts/verify_live.pycovers the live path on demand. - Documentation: architecture and the reasoning for each guard's position, Hermes install, limits, comparison, roadmap, and a guide to writing an adapter.
Notes on provenance¶
This supersedes an earlier approach that forked Hermes Agent to add roughly 670 lines. The fork meant every upstream release had to be merged rather than installed alongside, the decision layer could not be tested without all of Hermes, and users of other frameworks could not use any of it. This package contains no Hermes source and integrates through a seven-method host protocol instead, so the decision layer and the agent framework version independently.
Known gaps¶
Carried from docs/limits.md so they are visible in release notes:
- Streaming is not governed;
request_streamfalls through to the wrapped model. Governoris synchronous, so the Pydantic AI adapter runs it on a worker thread.- The Pydantic AI, Hermes and OpenClaw adapters are not verified in CI against live frameworks or a live gateway — their logic and transport properties are tested, real round trips are not.
- Vendor latency and price figures are not reproduced here as measurements.