AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Jevelry

skill-backant-io-jevelry-jevelry · by backant-io

Jev (TypeSafe System One) decisions: use when you or the code you are working on need a judgment call about text or data, such as triage of a ticket, a message or a log, whether something is urgent, whether an issue is a duplicate, how high the severity is, whether a change is risky, or whether a failing test is caused by the code or by the environment, and you would otherwise ask an LLM to retur…

— No reviews yet
0 installs
0 views
— view→install

Install

$ agentstack add skill-backant-io-jevelry-jevelry

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • ✓ Prompt-injection patterns
  • ✓ Secret / credential exfiltration
  • ✓ Dangerous shell & filesystem operations
  • ✓ Untrusted network calls
  • ✓ Known-malicious package signatures

What it can access

  • ✓ Network access No
  • ✓ Filesystem access No
  • ✓ Shell / process execution No
  • ✓ Environment & secrets No
  • ✓ Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-backant-io-jevelry-jevelry)

Reliability & compatibility

✓ Security review passed
0 installs to date
— no reviews yet
● yesterday

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Jevelry? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

jevelry

You are probably about to write a prompt that asks a chat model to return JSON so the code can branch on it. With jevelry you write a jevel instead, a small file with typed questions, and the code branches on a decision. This skill tells you how to install it, how to write a jevel, and how to wire the answer into the code you are working on.

Install

Run this in the project:

npx jevelry install

It puts this skill into every coding agent it finds on the machine and asks for the TypeSafe key, which you can skip with Enter. When the person already has the key in their keychain or in TYPESAFE_API_KEY, you are done. If you only need the skill, npx jevelry install-skill does that part alone.

When to reach for a jevel

Use a jevel when you or the code need one of these and the input is text or a record:

  • route something to one of a fixed set of destinations (a team, a template, a handler)
  • rate something on a scale you define (urgency, severity, frustration, risk)
  • check whether a statement is true of a document or a message (is this a refund request, does this bug report have steps)
  • decide the same thing for every item in a list (which open issues duplicate this one)

Keep arithmetic, counting, date comparison and anything a regex can find in the code, because Jev answers questions about meaning.

Seventeen jevels ship with the package, and each one fits a moment you run into while you work. Ask it with the state in a file, then do what the decision says:

| Moment | Command | On act | On mark | On fall_back | |---|---|---|---|---| | a test failed and the next step is a rerun, a report to the CI owner or a fix | npx jevelry run failing-test --state @test.json | the shipped commands only print the next step for the cause: rerun with retries, report it to the CI owner, or fix the code; replace them with your own commands | it asks first, and --yes runs it | its fall_back command prints that you should read the output yourself | | a service or a job printed a burst of log lines | npx jevelry ask log-triage --state @lines.json | treat it as the kind: a bug means fix the code, a misconfiguration means fix the setting, an outage means wait and report it | do the same and say in your summary that it was a guess | read the lines yourself before you change anything | | a test failed, or a review comment or a failing check lands on your pull request | npx jevelry ask review-comment-kind --state @comment.json | defect: fix the code, environment: fix or report the CI or the sandbox and leave the code alone, style: fold it into a cleanup pass | do the same and name the kind you assumed | read the comment and the failing output closer yourself | | you are about to merge or hand over a change | npx jevelry ask change-risk --state @change.json | risk at level 2: ask the person for a second reviewer, and breaking yes: add a migration note | apply the level and point the person at it | follow the project's usual review rules | | you wrote the description of a pull request | npx jevelry ask pr-description-check --state @pr.json | fix what it flags: describe the change, name the tests, cover the files the body passes over | fix it and tell the reviewer what you added | read the diff against the description yourself | | you are about to open an issue, or a new one came in | npx jevelry ask duplicate-issue --state @issue.json | same_as[i] yes: link to that issue and add your note there | link it and ask the person to confirm | search the tracker yourself | | you are about to start work on an issue | npx jevelry ask issue-readiness --state @issue.json | readiness at level 2: start, and when missing names a piece, ask the author for it first | start and list the assumptions you made | read the issue closely and ask the author what is unclear | | you are about to hand a task to a subagent or another model | npx jevelry ask task-difficulty --state @task.json | depth at level 0 goes to a cheap model, level 2 to a strong model or a person | route it as the level says and tell the person | route it the way you did before | | you finished work that was meant to follow a checklist | npx jevelry ask checklist-compliance --state @report.json | followed no: go back to the step deviation_kind points at | fix it and mention it in your summary | walk the checklist step by step yourself | | a support ticket comes into the app you are building | npx jevelry ask ticket-triage --state @ticket.json | route it to the team, and urgent yes puts it on top of the queue | route it and flag it for the queue owner | leave it in the general queue | | a mail or a chat message has to be sorted | npx jevelry ask message-triage --state @message.json | file it in the lane kind names | file it and show the lane to the inbox owner | leave it unsorted | | a request lands and you are unsure whose it is | npx jevelry ask escalation-route --state @request.json | send it to the route it names | send it and copy the shared inbox | leave it for a person to route | | an alert fired and somebody needs a first guess at the cause | npx jevelry ask alert-cause --state @alert.json | put the cause at the top of the alert with the change it points at | do the same and say it is a guess | list the recent changes under the alert | | notifications piled up for the person you work with | npx jevelry ask notification-triage --state @batch.json | worth_interrupting yes: tell them now | tell them and name the notification that caused it | hold the batch for their next break | | you replied to a question, or got a reply, and the thread might close | npx jevelry ask reply-check --state @thread.json | do what next says: close, follow up or reopen | do it and tell the person who asked | leave the thread open | | a review of a change is in and you decide whether it is enough | npx jevelry ask review-quality --state @review.json | thoroughness at level 0: ask for a second review | apply the level and flag it for the team lead | use the project's usual review rules | | you are turning meeting notes into tasks | npx jevelry ask meeting-notes --state @notes.json | log the decision, and owners_assigned no means you ask who owns the actions | do the same and show the chair the answers | file the notes as they are |

Each jevel's body says what its state looks like and its example.json is a state you can ask it with straight away, and the full list is in jevels/README.md.

Commands

| Command | What it does | |---|---| | npx jevelry install | installs this skill into every agent found, then asks for the key (skippable) | | npx jevelry install-skill [--project] | installs the skill only | | npx jevelry list | the jevels jevelry can find | | npx jevelry show | the resolved frontmatter and the body | | npx jevelry check | refuses a jevel the API would refuse and warns about questions Jev handles poorly | | npx jevelry ask --state @file | asks every question in the jevel about the state, prints one JSON document | | npx jevelry ask --questions '' --state '' | a one-off ask with the API's question shape | | npx jevelry run --state @file [--yes] [--dry-run] | asks the jevel and runs the command of the option Jev picked: act runs it, mark asks first, fall_back runs the jevel's fall_back | | npx jevelry outcome | records what proved true (agree, disagree, an option, a level index, yes, no) | | npx jevelry report [--jevel ] [--json] | agreement per question from the log | | npx jevelry tui [--dashboard] [--jevel ] | a full-screen terminal view of the log: a start screen, d for the dashboard of today's decisions, a review queue where a person presses c (correct) or w (wrong), and Try to ask a jevel live | | npx jevelry types [--out ] | writes TypeScript types for every jevel it finds, for jevel(name).decide() | | npx jevelry models | the model names the account may send |

Jevels are found in --jevels , then JEVELRY_JEVELS (colon separated), then ./jevels, then $JEVELRY_HOME/jevels (default ~/.jevelry/jevels), then the jevels that ship with jevelry. Keep the project's jevels in ./jevels/ so a person reviews them with the code.

Let Jev run the command

Use npx jevelry run --state @file when the next step after the decision is always one of a few commands, like rerunning a flaky test or filing an issue for the CI owner, and the jevel names those commands in a run block (failing-test is the one that ships). Run it with --dry-run first, so you see which command it picks and what it fills in. Leave --yes off while the person is around, because a mark then waits for their y, and exit 9 means the call was a mark and nobody confirmed it, so tell the person which command it wanted. run runs the commands of the first jevel it finds, and the project's ./jevels folder comes before the jevels that ship, so a jevels/failing-test/ in the repository replaces the shipped one; jevelry prints the jevel's path on stderr before it runs anything, and you check that path before you trust the command. When your own code acts on the answer, keep using ask or decide.

Write a jevel

Read references/writing-jevels.md before you write one; it is the whole method. Copy the nearest shipped jevel from the catalogue in jevels/README.md (npx jevelry show ticket-triage), which comes with an example.json and a cases.json you rewrite for your own states, pick the question type from the shape of the decision (choice for one of a set, score for a level, noul for yes or no), name the state keys in state.required, set act and mark by what a wrong answer costs, and then check the shape:

  • every instructions is an object, { question, focus } with inspect and compare when they help, and question points at the state with a backticked path
  • every choice option is { what, not_for, examples }, and every option in one question carries the same fields
  • every score level is { what, signals } and describes a situation, because Jev sees each level alone and with no number
  • every noul is one condition, { true: { what, examples }, false: { what, examples } }, and yes means the condition holds
  • every choice has a catch-all option like other or unclear
  • cases.json holds at least three cases: clear one way, clear the other way, and one unclear case that expects null
  • npx jevelry check prints 0 warnings, and every case lands on its expected answer against the real API (in this repository, npm run test:live -- tests/live/jevels.test.ts is green)

Wire the answer in

ask prints exactly one JSON document on stdout:

{ "protocol": 2, "logid": "...", "jevel": { "name": "ticket-triage", "version": 3 }, "model": "jev-1.13.0", "statehash": "sha256:...", "answers": { "team": { "type": "choice", "choice": "billing", "probabilities": { "other": 0, "technical": 0, "account": 0, "billing": 1 }, "confidence": 1, "certainty": 1, "decision": "act" }, "urgent": { "type": "noul", "noul": 0.98, "yes": true, "certainty": 0.98, "decision": "act" } }, "usage": { "inputtokens": 1280, "outputtokens": 77 } }

The values come from a live ask of ticket-triage on its example.json, trimmed to two of its three answers. The code reads decision per answer and branches: act means use the answer, mark means use it and flag the case for a person, fall_back means do what the code did before the jevel existed. The raw probabilities are there when the code needs its own rule. Answers for a repeat question are named same_as[0], same_as[1] and so on.

On failure the document is { "protocol": 2, "error": { "exit": 3, "code": "rate_limited", "message": "...", "retry_after_ms": 1200 } } and the exit code says what happened: 2 the jevel or state is wrong (the document names the field), 3 rate limited or overloaded, 4 the key is missing or refused, 5 over the token budget, 6 network, 7 an answer this build cannot read. 4 and 5 make no request. Branch on the exit code, show the message to a person.

From TypeScript or JavaScript, install jevelry in the project, load the jevel once when the program starts and call decide where the code decides:

npm install jevelry

import { jevel } from "jevelry";

const triage = jevel("ticket-triage");

const d = await triage.decide({ ticket });
switch (d.team?.decision) {
  case "act": route(ticket, d.team.answer); break;
  case "mark": route(ticket, d.team.answer); flagForQueueOwner(ticket); break;
  case "fall_back": leaveInGeneralQueue(ticket); break;
}

decide asks Jev, writes the ask to the log and hands back every question with its decision and its answer (the option for a choice, true or false for a noul, the level for a score). When Jev cannot answer, every question comes back fall_back with the reason in d.error, so the code keeps its old path. Run npx jevelry types --out src/jevels.d.ts after you write or change a jevel, so d.team.answer is typed as the options of that jevel. The lower level functions are importable too, import { ask, loadJevel, discoveryDirs } from "jevelry", and every other language spawns the CLI and parses stdout.

Rules

  • Keep the key out of your output, your logs and every commit. The SDK reads TYPESAFE_API_KEY, and jevelry also looks in the keychain and in ~/.jevelry/env.
  • Questions and thresholds stay in ./jevels//JEVEL.md, in one place, so the person you work with reviews them before they merge. Say in your summary which jevel you wrote and what its thresholds are.
  • Run check before ask, and prove the jevel with its cases.json (an obvious yes, an obvious no, an unsure one) before you wire a decision into anything.
  • Pin model to a concrete version and bump version when you change a question.
  • Reference: https://docs.typesafe.ai for Jev itself; references/writing-jevels.md and references/protocol.md in this skill for the file format and the document.

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.