agentleFS
shimo4228shimo4228/akc-cycle/skills/jev-judgment-design/SKILL.md

jev-judgment-design

Skill2 starsChanged 5 days agoMITView on GitHub

Design how a closed LLM judgment (relevance, novelty, evidence strength) moves to TypeSafe Jev. Use when replacing an LLM judgment with Jev, or when a Jev judgment lets everything through. For Jev's API and primitives, use typesafe:typesafe-ai first.

1 other project uses a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

5 rules. About 0 are common, 2 are distinctive, and 3 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Ask about novelty as "what does it add to evidence_set", not "is it new for this theme"

    line 48
  2. Distinctive:

    When asking about closeness on a graded scale, put "a different problem that only shares vocabulary" at the very bottom.

    line 52
  3. Distinctive:

    Separate the cutoff (gate) from the ordering (placement): Use Noul probabilities (is it relevant, is the method usable, does the evidence …

    line 74
  4. Very specific:

    Read probabilities and distributions from provider_details.

    line 115
  5. Very specific:

    If the LLMs used during a run are also called from the same Agent, you can swap only the writing model or the search-query model with a …

    line 119

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Jev judgment design

Jev answers closed questions with probabilities and does not write prose. Moving an LLM pipeline's judgments to Jev makes them cheap and parallel, but Jev answers only within the state it is handed. This skill owns the design of that state and of the side that decides accept/reject from the answers. The general design guidance for Jev (state / instructions / criteria, choosing Choice, Noul, or Score, no-match, set thresholds on your own data) is canonical in plugin skill typesafe:typesafe-ai, so read that first and read only the judgments layered on top here.

Sources: the implementation in jev-research-pipeline (https://github.com/shimo4228/jev-research-pipeline) and the article "Moving the research judgments I left to an LLM to Jev, a judgment-only model" (https://zenn.dev/shimo4228/articles/jev-research-judgment-offload).

1. Move only closed judgments

Move to Jev the judgments whose answer can be stated as a yes/no probability, one pick from a set of options, or a point on a graded scale. Keep work with an open-ended answer shape, such as where to search next or how to write, with the LLM. After the move, watch the instrument "number of LLM judgments during a run", not "number of questions to Jev" — Jev's question count may grow by as many judgments as were moved.

2. Put what the judgment is made against into state

"Is it relevant" lets through anything that shares vocabulary when the comparison target is not in state. Jev is answering exactly what it was asked, so the fix belongs in state, not in the question. Make the comparison target the question that theme is currently seeking an answer to, and pass scope, exclusions, and already-accepted evidence along with it.

state = {
    "question": {
        "title": question.title,        # the question currently seeking an answer
        "brief": question.brief,        # scope
        "evidence": question.evidence,  # what counts as evidence
        "not": question.negative_topics,  # topics that overlap in vocabulary but are out of scope
    },
    "source": {"title": ..., "url": ..., "excerpt": ...},
    "evidence_set": accepted_claims,    # evidence already accepted for this question (the baseline for novelty)
}
  • In not, list the neighboring topics that are especially easy to confuse (e.g. "alignment training of a model alone" for a question about intent alignment — most sources with alignment in the title were vocabulary matches such as cross-modal alignment)
  • Ask about novelty as "what does it add to evidence_set", not "is it new for this theme"

3. Put "only shares vocabulary" at the bottom tier of a Score

When asking about closeness on a graded scale, put "a different problem that only shares vocabulary" at the very bottom. Without this tier, Jev has no choice but to pull toward a nearby tier.

class Overlap(UseEnumMemberDocstrings, IntEnum):
    other_problem = 0
    """It works on a different problem that happens to share vocabulary."""
    same_field = 1
    """Same field as `question`, but not the problem `question` asks about."""
    same_problem = 2
    """It works on the problem `question` asks about, from another angle."""
    same_question = 3
    """It asks what `question` asks and reports an answer to it."""

Measured (2026-09-23, 3 sources with "intent" in the title against one question): they split into other_problem at 0.60 / same_field at 0.53 / same_problem at 0.77. Even with the same vocabulary, the tiers separate once placed next to the question.

4. Jev answers, code decides

Accept/reject is decided not by Jev's output but by code applying thresholds.

  • Separate the cutoff (gate) from the ordering (placement). Use Noul probabilities (is it relevant, is the method usable, does the evidence type fit) only for the cutoff; they can only drop things. Use the weighted Score tiers for ordering and the acceptance line. Mixing the cutoff into the weighting lets a strong tier compensate for a weak cutoff
  • Measured (2026-09-23): a source at tier same_problem 0.77 had a relevance probability of 0.44, fell short of the 0.5 cutoff, and was rejected. Treat the tier and "is it relevant" as separate answers

5. The unit of judgment is "1 source × 1 question"

  • A design that asks about each sentence in isolation loses context and inflates the question count by the number of sentences (a real case: 20,000 questions and a 283 KB report for one run on one theme). Make the unit one source
  • Split into 2 stages: first, per source, ask cheaply in 1 request whether it "seems relevant" to every question, to narrow the candidates. Ask in detail only about the remaining "source × question" pairs. Judgments that need a sentence unit (does this sentence advance the question, does the source really say that) are done only within accepted sources, and whatever can be matched as a string is matched by code first

6. Place sources that must pass (canary)

Even if narrowing reduces volume, volume alone cannot tell you whether sources that should have been read were dropped too. For each question, place a few sources known to be "must pass", and record on every run whether they passed. If a canary drops, suspect state (brief / not) before the thresholds.

7. Calling from Pydantic AI

Pydantic AI's TypeSafe model (as-of 2026-09-23, https://pydantic.dev/docs/ai/models/typesafe/):

from pydantic_ai import Agent

agent = Agent("typesafe:jev-1.13.0", output_type=Answers)
run = await agent.run(json.dumps(state, ensure_ascii=False, sort_keys=True))
dist = run.response.provider_details["probabilities"]
Output type fieldJev primitive
float (ge=0, le=1)Noul (probability of "yes")
Literal[...] / string EnumChoice
IntEnum with docstringsScore
  • Pin the version (thresholds were tuned against that version). Check in code that run.response.model_name matches the pinned version
  • Read probabilities and distributions from provider_details; do not decide accept/reject from the rounded values in run.output alone

8. Keep searching and writing with the LLM, and swap models by string

If the LLMs used during a run are also called from the same Agent, you can swap only the writing model or the search-query model with a single string, without changing the judgment types. Things that only need to be produced once before a run, like questions and search queries, can be written outside the run by a strong model (Claude etc.) and stored in files, removing them from the LLM calls during the run.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.