Skip to content

Questions

Dispatch asks a fixed catalogue, plus one Choice per label dimension, plus anything you define. All of them go in one request per event.

Issues

idTypeAsks
typechoicebug, feature, question, docs, support, spam
is_spamnoulPromotional, automated, or off-topic?
has_repronoulSteps, code, or input a maintainer could run?
has_versionnoulWhich version is affected?
has_environmentnoulWhich runtime, browser, or OS?
severityscoreCosmetic → data loss, security, or total breakage
belongs_in_discussionsnoulBetter as a discussion than an issue?
good_first_issuenoulCould a newcomer plausibly fix it?
hostilityscoreNeutral → abusive

Pull requests

idTypeAsks
change_typechoicefeat, fix, docs, refactor, perf, test, build, ci, chore
semver_bumpchoicenone, patch, minor, major
breaking_changenoulBreaks existing API, options, or output?
riskscoreIsolated → touches security, auth, data, or release machinery
needs_testsnoulChanges behaviour with no test?
description_qualityscoreEmpty → clear with context and trade-offs
matches_linked_issuenoulDoes it do what the issue asked?
low_effortnoulDrive-by, churn, or generated slop?
touches_security_surfacenoulAuth, secrets, input parsing, dependency sources?

Generated from your labels

Each dimension under labels: becomes label_<dimension>, a Choice whose options are your label names and whose rubric is your descriptions, plus __none__.

Your own

yaml
questions:
  affects_ssr:
    type: noul
    instructions: 'Does this involve server-side or headless rendering?'

Available in rules as answers.affects_ssr.

Writing a good question

Atomic. One question asks one thing a knowledgeable person could answer in seconds. "Should this be closed?" is wrong. "Is there a reproduction?" is right.

Decompose, then combine in code. Ask about risk and test coverage separately, then weigh them in a rule. Changing priorities becomes a coefficient, not a rewrite.

The criteria are the rubric. They are what the model actually reads. Write them for someone who has never seen your repository.

Give every Choice an escape hatch. __none__ is added automatically for generated label questions; add it yourself for custom ones, so the model is never forced into a wrong bucket.

Facts in state, judgements in questions. The body and the label catalogue go in state; "which label applies" is the question.

Turning them off

yaml
disableQuestions: [good_first_issue]

A rule still referencing a disabled question is a validation error, not a silent no-op.

Cost of asking more

Very little. Questions are evaluated in parallel and in isolation: thirty cost 25 ms more at the median than one. Tokens grow at roughly 23 per question, so cost scales gently and latency does not.

Past 40 questions dispatch validate warns — not because the model struggles, but because a set that large usually means a taxonomy that wants splitting.

MIT licensed.