stingray
Claude Code Stop hook that uses Jev to catch turns ending half-done: no action, broken promises, unwatched work or wrong language.
Overview
stingray is a Claude Code Stop hook for turns that stop prematurely. It stays silent normally and intervenes with a nudge when a turn ends half-done, so the turn does not close on an empty promise. It catches four shapes, all judged by Jev: no_action (stopped without doing anything when it could have acted), broken_promise (declared an action that the turn's tool calls do not account for), unwatched (promised to monitor CI, a build or a PR review), and wrong_language (the final message is not in the language your settings ask for). Documentation is in English and Traditional Chinese.
For the monitoring shape, Jev judges whether the message promises to watch something, while a local exact count of background tasks, crons and pending handoffs decides whether anything is actually running. The README describes replacing earlier regexes, which read topic rather than commitment, and reports that on 50 labelled lines promises score 0.68 and above and non-promises 0.20 and below. For the language check, language names are replaced with a placeholder because Jev was fooled by replies that merely mentioned a language. Switches are off by default, friction only increases, and loop protection prevents repeated blocking.
What the decision model decides
| Type | Question | Answers |
|---|---|---|
| Yes / no | Did this turn stop without doing anything it could have done? | — |
| Yes / no | Did the turn declare an action its tool calls do not account for? | — |
| Yes / no | Does the final message promise to watch an external result? | — |
| Yes / no | Is the final message written in the configured language? | — |
How it works
- On Stop, collect the turn's final message and tool calls
- Ask Jev the four shape questions; count background work locally
- Block the stop with a nudge when a shape fires
- Let Claude continue the work
Strengths
- Catches empty promises that regex missed
- Works across languages
- Exact local count for running work
Caveats
- Some switches are off by default
- Turn content is sent to TypeSafe
Getting started
Install the hook per the README and set a TypeSafe API key.At a glance
- Type
- Hook
- Status
- beta
- Language
- Python
- Runtime
- Claude Code Stop hook
- Has code
- yes
- Has tests
- yes
Use cases and integrations
How curated lists describe it
A Claude Code Stop hook for the turn that ends half-done — nothing done, an announced action never carried out, a promise to watch CI with nothing running — or in the wrong language. Every judgement is made by TypeSafe Jev.
hellogumbo/awesome-jev
Frequently asked questions
What does Jev decide?
Whether a turn did nothing, broke a promise, promised unwatched monitoring, or used the wrong language.
Why not regex?
The README says regexes matched topics rather than commitments and missed non-English promises.
Will it loop forever?
No; it has loop protection.
Related projects
Claude Code Stop hook that blocks an unverified done: one four-question Jev call only when files changed and no check passed.
PluginbetaTypeScriptClaude Code plugin where Claude plans phased work with checks and, at each stop, Jev judges whether the work is really done.
PluginbetaTypeScriptStop hook for coding agents where Jev checks each attempted stop against plain-language rules and sends the agent back if one is violated.
HookbetaPythonGitHub Action where an AI agent turns an issue into a PR behind guards, checks, a reviewer and a Jev gate that escalates when unsure.
ProjectprototypeTypeScriptSoftware-factory supervisor where Jev independently judges coding agents' completion, test sufficiency, progress and need for a human.
ProjectbetaPythonAsynchronous System-1 supervisory plugin for Hermes Agent with typed Jev decisions, ranking, verification and an opt-in tool gate.
ProjectbetaPython