Skip to content

stingray

Claude Code Stop hook that uses Jev to catch turns ending half-done: no action, broken promises, unwatched work or wrong language.

Hookbeta

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

TypeQuestionAnswers
Yes / noDid this turn stop without doing anything it could have done?—
Yes / noDid the turn declare an action its tool calls do not account for?—
Yes / noDoes the final message promise to watch an external result?—
Yes / noIs the final message written in the configured language?—

How it works

  1. On Stop, collect the turn's final message and tool calls
  2. Ask Jev the four shape questions; count background work locally
  3. Block the stop with a nudge when a shape fires
  4. 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.

    PluginbetaTypeScript
  • Claude Code plugin where Claude plans phased work with checks and, at each stop, Jev judges whether the work is really done.

    PluginbetaTypeScript
  • Stop hook for coding agents where Jev checks each attempted stop against plain-language rules and sends the agent back if one is violated.

    HookbetaPython
  • GitHub Action where an AI agent turns an issue into a PR behind guards, checks, a reviewer and a Jev gate that escalates when unsure.

    ProjectprototypeTypeScript
  • Software-factory supervisor where Jev independently judges coding agents' completion, test sufficiency, progress and need for a human.

    ProjectbetaPython
  • Asynchronous System-1 supervisory plugin for Hermes Agent with typed Jev decisions, ranking, verification and an opt-in tool gate.

    ProjectbetaPython