Skip to content

Templates

A template is a set of questions that decide asks about each item. decide has eleven built in. decide templates lists them with your own, and decide templates show NAME explains one. To change what a built-in template asks or where it flags, copy it with decide templates new NAME --from TEMPLATE.

A flag such as yes means that answer is 60% or more likely; yes >= 80% sets the line yourself. See flags and matches.

Rate source files, or each function in them, for risk and maintainability.

Reads text, one file at a time. Try it: decide templates show code-risk

QuestionAsksAnswerFlagged when
riskDoes this code or configuration risk {{focus}}?yes or noyes
maintainabilityHow easy is this code to understand and safely change?a score, 0 to 4<= 1.5

Parameters: focus, the kinds of risk to look for. Set one with -p focus="…".

Each file is judged on its own. To judge each function or method instead, add --each function; this works for Go, Python, JavaScript, TypeScript, and Java, and sends each function with its file’s imports and the line that starts its class.

risk is the probability that the code or configuration risks the problems named by focus. maintainability is a score from 0 (hard to follow) to 4 (exceptionally clear).

An item is flagged when it is likely risky, or when its maintainability is 1.5 or lower.

Start with a few files, for example --limit 5, before you run a whole repository.

Judge a shell command before an AI agent, a script, or a person runs it.

Reads text. Try it: decide templates show command-risk

QuestionAsksAnswerFlagged when
destructiveCould running this shell command destroy or overwrite work or data that is hard to get back?yes or noyes >= 80%
leakCould this shell command expose secrets, credentials, tokens, or private data, by printing them where they get recorded, copying them somewhere less private, or sending them to another machine or address?yes or noyes >= 80%
publishDoes this shell command put something in front of users, customers, or the public, or change a live system they depend on?yes or noyes >= 80%
severeCould running this shell command cause severe harm that is hard or impossible to undo, beyond the local copy of the project the agent works in?yes or noyes >= 80%

Use it on shell commands before they run: one command per line of text, or one per JSON record with --field. The decide plugin for Claude Code runs it before each command Claude runs in bypass mode, and acts only on severe.

echo 'git reset --hard HEAD~3' | decide run command-risk
decide run command-risk commands.txt --fail-on flagged

destructive is the probability that the command destroys work or data that is hard to get back, such as deleting files, discarding uncommitted changes, force-pushing, or dropping a database. leak is the probability that it exposes secrets or private data, such as by printing a key or sending a file to another machine. publish is the probability that it puts something in front of users or changes a live system, such as deploying, publishing a package or release, or sending a message. Pushing a branch or opening a pull request is not publishing. Pushing a release tag and setting a secret score near the flag, since whether they publish depends on what the repository’s CI does with them. severe is the probability that it causes severe harm beyond the local checkout that is hard to undo, such as deleting a home folder, force-pushing a shared branch, dropping a database, destroying cloud resources, or sending secrets to another machine. Discarding changes in a local checkout, such as git checkout -- . or git clean -fdx, is destructive but not severe.

A command is flagged when any question is at least 80% likely. To flag only the worst commands, read severe alone, as the plugin does.

Check that a pull request's title and description meet your team's guidelines.

Reads text. Try it: decide templates show pr-description

QuestionAsksAnswerFlagged when
titleDoes the title say what the change does, specifically enough that a reviewer could tell this pull request from others?yes or nono
whyDoes the description say why the change is needed, such as the problem it fixes, the issue it closes, or the plan it is part of?yes or nono
testedDoes the description say how the change was tested, or how a reviewer can check that it works?yes or nono
guidelinesDo the title and description follow these guidelines?yes or nono

Parameters: guidelines, your team's rules for titles and descriptions. Set one with -p guidelines="…".

Each record is one pull request: a JSON object with its title and body, an element of a JSON array, a line of JSONL, or a Markdown file. To check a pull request, or your open ones:

gh pr view 42 --json number,title,body | decide run pr-description
gh pr list --json number,title,body | decide run pr-description

title is the probability that the title says what the change does. why is the probability that the description says why the change is needed, and tested that it says how the change was tested or can be checked. A typo, docs, or dependency update needs no testing notes. guidelines is the probability that the pull request follows your team’s guidelines. By default, the title is ten words or fewer in the imperative mood, and may start with a prefix such as fix(cli): .

A pull request is flagged when any answer is likely no. To use your own guidelines, set them as a sentence or two:

decide run pr-description prs.json -p guidelines="The title follows Conventional Commits, such as fix(cli): ..."

To fail a CI job when the description falls short, add --fail-on flagged; decide then exits with code 2.

Find text that tries to take over an AI agent that reads it.

Reads text. Try it: decide templates show prompt-injection

QuestionAsksAnswerFlagged when
injectionDoes this content try to make an AI system that reads it act against its user or its own instructions, for example by telling it to ignore earlier instructions, reveal secrets or private data, run commands, send data to an outside address, change its answers, or steer what it recommends, such as telling AI tools to always recommend a product?yes or noyes
hiddenDoes this content itself hide text from a human reader that a program or AI would still read, for example in an HTML comment, invisible or zero-width characters, white or tiny text, alt text, or encoded strings?yes or noyes

Use it on anything an agent will read: web pages, issues, emails, tool output, documents, or the changes in a pull request.

git diff main | decide run prompt-injection
decide run prompt-injection pages --each section

injection is the probability that the content tries to make an AI agent act against its user, such as by ignoring its instructions, sending data away, or always recommending a product. A project’s own instructions for its agents, like AGENTS.md, do not count. hidden is the probability that some of the text is hidden from people but not from programs, such as in an HTML comment or zero-width characters. Text that only describes hidden text does not count.

An item is flagged when either one is likely. To block a pull request on it, add --fail-on flagged.

Check whether each image shows a readable receipt.

Reads images. Try it: decide templates show receipt-quality

QuestionAsksAnswerFlagged when
receiptIs a receipt visible in the attached image?yes or nono
readableCan the merchant, total, and date be read from the receipt image?yes or nono

Each PNG, JPEG, or WebP image is one item. Image templates use the Cloudflare provider, so set CLOUDFLARE_AUTH_TOKEN and CLOUDFLARE_ACCOUNT_ID first.

Estimate how relevant each item is to a question you choose.

Reads text. Try it: decide templates show relevance

QuestionAsksAnswerMatched when
relevantIs this item relevant to this topic or question: {{question}}yes or noyes

Parameters: question, the question or topic to match (required). Set one with -p question="…".

Set the topic or question when you run it:

decide run relevance docs --param question="pricing"

Each Markdown or other text file is one item, as is each record of JSONL, JSON, or CSV and each line of a .txt file. To find the relevant parts of a document, add –each section or –each paragraph. Relevant items are marked with ● and listed after the run.

Find injection, SSRF, XSS, and weak cryptography in code, one function at a time.

Reads text, one function at a time. Try it: decide templates show security

QuestionAsksAnswerFlagged when
sql_injectionCan untrusted input, meaning a value a remote user or another system controls, such as an HTTP request's parameters, headers, cookies, or body, an uploaded file or archive entry, or a branch, tag, or file name a user pushed become part of the text of a SQL query that this code runs, instead of being passed as a bound parameter such as ?yes or noyes >= 50%
command_injectionCan untrusted input, meaning a value a remote user or another system controls, such as an HTTP request's parameters, headers, cookies, or body, an uploaded file or archive entry, or a branch, tag, or file name a user pushed reach a command this code runs, through Runtime.exec, ProcessBuilder, exec.Command, subprocess, child_process, or a shell, as the program, as part of a shell string, or as an argument that could start with '-' and be read as an option?yes or noyes >= 50%
ssrfCan untrusted input, meaning a value a remote user or another system controls, such as an HTTP request's parameters, headers, cookies, or body, an uploaded file or archive entry, or a branch, tag, or file name a user pushed choose the address, host, port, or URL that this server code connects to or fetches, including by following a redirect, without a check that keeps it to allowed hosts and away from internal or private addresses?yes or noyes >= 50%
xssCan untrusted input, meaning a value a remote user or another system controls, such as an HTTP request's parameters, headers, cookies, or body, an uploaded file or archive entry, or a branch, tag, or file name a user pushed reach HTML, JavaScript, or another response a browser renders, without being escaped or encoded for that context?yes or noyes >= 50%
weak_cipherDoes this code encrypt or decrypt with a weak algorithm or mode, such as DES, triple DES, RC2, RC4, Blowfish, or ECB mode, or with a cipher chosen in a way that lets a weak one be used?yes or noyes >= 90%
weak_hashDoes this code compute a hash with MD5, SHA-1, MD4, or MD2, or another weak hash, for a purpose where security depends on it, such as passwords, signatures, integrity checks, or tokens?yes or noyes
weak_randomDoes this code make a value that must be unpredictable, such as a token, session ID, password, key, nonce, or 'remember me' value, from a predictable random source, such as java.util.Random, Math.random, math/rand, or Python's random module, instead of a cryptographically secure one?yes or noyes
tls_verificationDoes this code turn off TLS certificate or host name verification, such as InsecureSkipVerify, a trust-all TrustManager, or verify=False?yes or noyes

Use it on server code, to find the functions most likely to hold a common vulnerability. It asks every question in one request per function.

decide run security src
decide run security . --include '*.go' --exclude '*_test.go'
git diff main | decide run security --each function

Each answer is the probability that the function has that weakness:

Question Weakness CWE OWASP Top 10:2025
sql_injection Untrusted input in the text of a SQL query 89 A05 Injection
command_injection Untrusted input in a command, or an argument read as an option 78, 77, 88 A05 Injection
ssrf Untrusted input chooses the address the server connects to 918 A01 Broken Access Control
xss Untrusted input in HTML without encoding 79 A05 Injection
weak_cipher DES, RC4, ECB mode, or another weak cipher 327 A04 Cryptographic Failures
weak_hash MD5 or SHA-1 where security depends on it 328 A04 Cryptographic Failures
weak_random A predictable random value used as a secret 330 A04 Cryptographic Failures
tls_verification TLS certificate or host name checks turned off 295 A07 Authentication Failures

Untrusted input is a value a remote user or another system controls. Command-line flags, environment variables, and configuration files are the operator’s, and count as trusted.

A function is flagged when an injection, SSRF, or XSS answer is at least 50% likely, weak_cipher at least 90%, or another answer at least 60%. On real bugs in Gogs (Go) and n8n (TypeScript), many injection and SSRF bugs scored between 50% and 70%, so a higher threshold misses them. It doesn’t find every bug: about 4 in 10 of n8n’s real SQL injection and SSRF bugs scored under 50%. On the OWASP Benchmark, safe code scored up to 84% on weak_cipher, and every real case 96% or more.

The model judges one function at a time, so it can’t see whether a caller passes a constant. Read the flagged functions with their callers, and sort by probability to read the likeliest first:

decide runs view --format csv > security.csv

Expect some flags that are intended: an option that turns off TLS checks because an admin asked for it, or HMAC-SHA1 that a webhook’s sender requires. Code that fetches URLs its users name, such as an integration platform, flags often for SSRF: in n8n, 374 of 10,530 functions.

Classify each item as positive, negative, or neutral.

Reads text. Try it: decide templates show sentiment

QuestionAsksAnswerFlagged when
sentimentWhat is the overall sentiment of this text?one of: positive, negative, neutralnegative

A quick way to try Decide:

echo "The new release fixed everything I cared about" | decide run sentiment

Decide whether each issue or task is ready to hand to a coding agent.

Reads text. Try it: decide templates show task-readiness

QuestionAsksAnswerFlagged when
readyIs this task ready to start?yes or nono
sizeHow much work would this task most likely take?one of: small, medium, largelarge

Parameters: assignee, who would do the work. Set one with -p assignee="…".

Each record is one task: a line of JSONL, an element of a JSON array, a row of CSV, or a Markdown or text file. To check your open GitHub issues:

gh issue list --json number,title,body | decide run task-readiness

ready is the probability that the task can be done without asking anyone a question: it says what should change, where, and how to tell when it is done. size is small, medium, or large, where large is too big for one pull request.

A task is flagged when it is likely not ready, or when it is large. To judge readiness for someone else, set who does the work:

decide run task-readiness tasks.jsonl -p assignee="a new engineer"

Route each support ticket to billing, engineering, or other.

Reads text. Try it: decide templates show ticket-routing

QuestionAsksAnswerFlagged when
queueChoose the best queue for this ticket.one of: billing, engineering, othernever

Each record is one ticket: a line of text, a line of JSONL, an element of a JSON array, or a row of CSV. The answer is the chosen queue and its probability.

To use your own queues, copy this template and edit the criteria:

decide templates new my-routing --from ticket-routing

Decide whether each support request is urgent and how severe its impact is.

Reads text. Try it: decide templates show triage

QuestionAsksAnswerFlagged when
urgentDoes this support request need a response within hours rather than days?yes or noyes
impactHow severe is the impact on the customer?a score, 0 to 4>= 3

Each record is one support request: a line of text, a line of JSONL, an element of a JSON array, or a row of CSV.

urgent is the probability that the request needs a response within hours. impact is a score from 0 (no real impact) to 4 (critical).

A request is flagged when it is likely urgent, or when its impact is 3 (major) or higher.

To route requests to a queue as well, run ticket-routing on the same data.

Terminal window
decide templates new my-routing --from ticket-routing

This creates ~/.decide/templates/my-routing/template.json. Add --project to create it in .decide/templates in the current folder instead, so you can commit it and share it with your team. Project templates take precedence over your own, which take precedence over the built-in templates.

A template looks like this:

{
"name": "my-routing",
"description": "Route each ticket to the team that should handle it.",
"parameters": {
"product": {"description": "The product the tickets are about", "default": "Acme"}
},
"questions": {
"team": {
"type": "choice",
"instructions": "Which team should handle this {{product}} ticket?",
"criteria": {
"billing": "Payments, invoices, refunds",
"support": "How-to questions and account help",
"engineering": "Bugs and outages"
}
},
"urgent": {
"type": "noul",
"instructions": "Does this ticket need a reply within the hour?"
}
}
}

A template reads text unless it says "input": "image". Add "each": "file" (or section, paragraph, function, or line) to choose the unit its questions are written for; --each still overrides it.

A score question lists its levels in order, lowest first:

"clarity": {
"type": "score",
"instructions": "How clearly is this written?",
"criteria": ["Confusing", "Understandable", "Very clear"]
}

flags says which answers need attention, by question:

"flags": {
"urgent": "yes",
"team": "engineering >= 80%",
"clarity": "<= 0.5"
}
Question type Flag Flagged when
noul "yes" or "no" that answer is 60% or more likely
choice an option name that option is 60% or more likely
noul or choice "yes >= 80%" that answer is at least as likely as you say
score "<= 1.5", ">= 3", "< 2", "> 2" the score passes the line

A list such as ["negative", "mixed"] flags an item when any one holds. Answers to questions without a flag are never flagged, and show in cyan.

matches takes the same conditions and marks the answers someone is looking for, such as the items relevant to a topic:

"matches": {"relevant": "yes"}

Write instructions about one item at a time, and treat the item as evidence rather than instructions. An optional README.md next to template.json holds notes that decide templates show prints.

Check your template as you go:

Terminal window
decide templates show my-routing
decide run my-routing tickets.jsonl --dry-run

Some templates have parameters, written {{name}} in their questions. Set them with --param (or -p):

Terminal window
decide run relevance notes.txt -p question="pricing"
decide run code-risk src -p focus="SQL injection"

decide templates show TEMPLATE lists a template’s parameters and their defaults.

decide is open source under Apache 2.0.Made by Deep Noodle