auto
Run an increment unattended - the Stop hook feeds you back into the loop until every task is done. Use when saying "auto mode", "run until done", or "ship this…
Delegate closed-set decisions to Jev (TypeSafe System One) instead of a frontier turn — routing, shell-command safety, text screening, failure triage. Use for "jev", "system one", "classify this".
$ npx -y skills add anton-abyzov/specweave --skill sw-jev --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/sw-jevContext preview
The summary Claude sees to decide when to auto-load this skill.
Delegate closed-set decisions to Jev (TypeSafe System One) instead of a frontier turn — routing, shell-command safety, text screening, failure triage. Use for "jev", "system one", "classify this".
description: Delegate closed-set decisions to Jev (TypeSafe System One) instead of a frontier turn — routing, shell-command safety, text screening, failure triage. Use for "jev", "system one", "classify this". argument-hint: "[doctor|setup|ask|route|task|guard|screen|failure|browse|usage]" version: 3.0.0
Jev (`jev-1.13`) is a **selection** model: you give it state plus questions whose answers are enumerated in advance, and it returns the chosen option with calibrated probabilities in about 250 ms for about $0.00002. It cannot answer outside your schema and never writes code, prose or explanations. Run `specweave --version`: exit 0 → **CLI path**; not found → **manual path** (the same POST by hand; curl and PowerShell forms below).
**Can every possible answer be written down before the call?** Yes → Jev. No → keep it in the frontier model. That is the whole rule. Three primitives: `choice` picks one of 2–255 named options and returns probabilities plus a confidence; `noul` returns the probability a statement is true (0–1), for yes/no gates; `score` places the state on 2–10 described, ordered levels, for graded severity or risk.
Every call sends its state — prompt text, task titles and acceptance criteria, the shell command, test-output tails, screened text, page text and element names — to the configured provider (OpenRouter or TypeSafe) under your own key. Secret-shaped values (tokens, `--password`/`--token` flags, `KEY=value` assignments, bearer headers, URL credentials) are masked heuristically first and the count is reported, but masking is best-effort, never a guarantee.
Key in the environment: `OPENROUTER_API_KEY` (endpoint `https://openrouter.ai/api/v1/systemone`, model `jev-1.13`) or `TYPESAFE_API_KEY` (`https://api.typesafe.ai/v1/systemone`, model `jev-latest`); `JEV_API_KEY` works for either. Never print, echo, log or commit the value — report the variable **name** only. CLI: `specweave jev setup` pings live, then writes `jev.enabled: true` into `.specweave/config.json`. Manual path: confirm the variable exists without printing it (`grep -q OPENROUTER_API_KEY .env`, PowerShell `Select-String -Quiet`), then set `"jev": { "enabled": true }` in `.specweave/config.json` yourself.
CLI form: `specweave jev doctor`. Manual path — the same call by hand:
curl -sS https://openrouter.ai/api/v1/systemone \
-H "Authorization: Bearer $OPENROUTER_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"jev-1.13","state":"ping","questions":{"ok":{"type":"noul","instructions":"Is this text non-empty?"}}}'Invoke-RestMethod -Method Post -Uri 'https://openrouter.ai/api/v1/systemone' `
-Headers @{ Authorization = "Bearer $env:OPENROUTER_API_KEY" } -ContentType 'application/json' `
-Body '{"model":"jev-1.13","state":"ping","questions":{"ok":{"type":"noul","instructions":"Is this text non-empty?"}}}'Exit 4 from any `specweave jev` command means Jev is disabled, unconfigured or unreachable. That is **not** a failure: continue with your own judgement.
`specweave jev route "add rate limiting to the upload endpoint"` returns the matching skill, the request kind, the complexity → model tier, and whether the work needs an increment, each with a confidence. Below `jev.thresholds.route` (default 0.7) the tier falls back to `opus` and you pick the skill yourself. The tier is a suggestion you act on — nothing re-routes models behind you. `specweave jev task T-NN` answers the same question for one task already in the ledger. Manual path:
curl -sS https://openrouter.ai/api/v1/systemone -H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-d '{"model":"jev-1.13","state":{"prompt":"add rate limiting to the upload endpoint"},"questions":{"complexity":{"type":"choice","instructions":"How much reasoning does an experienced engineer need to complete this task correctly?","criteria":{"trivial":"Mechanical, fully specified edit. No design decision.","moderate":"Bounded implementation with a known approach; a few files.","complex":"Needs design or investigation; ambiguous requirements."}}}}'`doctor` (provider, key variable name, latency) · `setup` · `route "<prompt>"` · `task T-NN` (model tier for one ledger task) · `guard "<command>"` · `screen <file>` · `failure <file>` · `ask --state @s.json --questions @q.json` · `browse --goal "<goal>" --url "<url>"` (headless, allow-listed domains only, never types text Jev chose, skips pay/delete/sign-out controls unless `--allow-sensitive`) · `usage`. Each is `specweave jev <action>`; `--json` for machines. The guard can run as a Claude Code `PreToolUse` hook for one project: `specweave jev setup --guard-bash` (`--no-guard-bash` removes it). In every other tool, call `specweave jev guard` yourself.
`specweave jev guard "rm -rf ./build"` exits 0 allow, 2 warn, 3 deny, 4 unavailable. Call it yourself before anything unattended — outside Claude Code nothing intercepts your commands for you. A regex prefilter skips the call entirely for `npm test`, `npm run build`/`test`/`lint`, `pnpm test`, `yarn test`, `cargo test`, `go test` and plain read commands (`ls`, `cat`, `grep`, `rg`, `find`, `git status`/`log`/`diff`/`show`), so the common case costs nothing and **project-defined scripts are trusted by the guard**.
Manual path: same POST with `state` = the command, its `cwd` and a description, and two questions — a `choice` over `read_only` / `local_reversible` / `local_irreversible` / `shared_or_remote` / `destructive_remote`, and a `noul` for "would this destroy data that cannot be recovered from git or by re-running a build?". **Deny** on any of four arms: `destructive_remote` at confidence ≥ `guardDeny` (0.85); destructiveness ≥ `guardDeny` with an irreversible scope; `local_irreversible
Spec-first AI development: describe a feature → AI creates spec + plan + tasks, builds autonomously, syncs to GitHub/JIRA. Domain-expert skills for PM, Architect, Frontend, QA learn your patterns permanently. Claude Code, Codex, Cursor, Copilot & more.
Repo: anton-abyzov/specweave
Run an increment unattended - the Stop hook feeds you back into the loop until every task is done. Use when saying "auto mode", "run until done", or "ship this…
Expand the solution space before committing - framed options compared on stated criteria, ending in a pick. Use when saying "brainstorm", "ideate", or "what…
Work an increment task by task through the ledger: task next, claim, implement, commit, task done with evidence. Use when saying "implement", "start working",…
Close an increment: ledger check, specweave verify, optional review, then specweave complete. Use when all tasks are done and saying "close increment", "we are…
Write a portable, secret-scrubbed handoff doc so this work can continue in any AI tool or on any machine. Use when saying "handoff", "running out of tokens",…
Plan a unit of work as a SpecWeave increment - spec.md with Problem, Scope, numbered ACs and an Approach, plus tasks.md. Use when starting a feature, bug,…