questionnaire
Skill0 starsChanged 3 months agoMITView on GitHub
Build, render and read back a data-driven questionnaire page — scaffold the kind page once, author a JSON spec per questionnaire, render it, and parse the hand-back block the person pastes into the chat. Use when you need to ask someone a set of questions and get structured answers back.
4 other projects use a version of this.
Adopted by
Most recently taken up by
- eyeix/skillstheir own version, first seen Oct 13, 2026
- Hamid-dev13/claude-skillstheir own version, first seen Oct 11, 2026
- youhei-ushio/dotclaude-publictheir own version, first seen Sep 16, 2026
- toverux/cantripstheir own version, first seen Jul 25, 2026
Other versions4 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 4
- toverux/cantrips★ 3same name
- eyeix/skills★ 1same name
- youhei-ushio/dotclaude-public★ 1same name
- Hamid-dev13/claude-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
We split this skill into the rules it gives an agent
6 rules. About 0 are common, 4 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 28
Keep them separate. A project skill that inlines this one's mechanics stops getting fixes.
- Very specific: line 34
If .render/ does not exist yet, run /render:init first.
- Very specific: line 52
Put the specs somewhere that belongs to the project, not inside .render/ — they are content, and someone other than you may want to read …
- Distinctive: line 89
never mark anything optional and never make anything mandatory.
- Distinctive: line 90
Don't-know standing on every question carry that message
- Distinctive: line 154
keep the routing rule in the project skill, not here
≈ “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.
Files
Questionnaire pages on the render engine
When
You need answers from a person that you cannot derive yourself, and there are enough of them that asking in chat would be a slog — an intake, a review, a set of decisions someone has to make before work can continue.
The loop is: spec in → page out → person answers → hand-back block in → structured answers out. You own the first and the last step; the plugin owns everything between them.
What this plugin does not decide
The plugin knows how to ask. It does not know what to ask or where the answers go — that is the consuming project's business.
- The project's own skill owns the trigger ("when the user starts a new engagement, ask the intake questions"), the domain wording, and the routing of answers into files, tickets or a plan.
- This skill owns the spec schema, the rendering, and the parsing.
Keep them separate. A project skill that inlines this one's mechanics stops getting fixes; this skill that learns a project's vocabulary stops being usable anywhere else.
1. Scaffold the kind page — once per project
If .render/ does not exist yet, run /render:init first.
A questionnaire family is one page folder plus a folder for the specs. The page is about ten lines and never changes again:
# .render/pages/survey/__init__.py
"""Questionnaires — one page per spec in docs/questions/."""
TITLE = "Questionnaire" # per-page title; each page shows its spec's own
KIND = "questionnaire" # rendered by the engine's questionnaire kind
SOURCES = "docs/questions/*.json" # glob, relative to ROOT — one output per matchSOURCES is the lifecycle. Every spec that matches becomes a page; move a
spec out of the glob and --prune deletes the page that belonged to it. There is
no folder to create or delete per questionnaire, and no registry to update.
Put the specs somewhere that belongs to the project, not inside
.render/ — they are content, and someone other than you may want to read
them.
2. Author a spec
One JSON file per questionnaire. The shape:
{ "id": "2026-08-intake", "title": "Project intake",
"intro": "markdown", "handback-marker": "ACME INTAKE ANSWERS",
"sections": [ { "title": "Scope", "questions": [
{ "id": "q01", "question": "…", "why": "one line: what this decides",
"type": "single", "options": [ { "key": "a", "label": "…" } ],
"show-if": { "question": "q00", "answer": ["a"] },
"meta": { "routes-to": "…" } } ] } ] }The rules that matter:
idstable and unique — it keys both the saved answers and the output file name; questionids are the join key in the hand-backtypeissingle(default) ·multi·amount·text; prefersingleover free text; give every question awhy; useshow-ifrather than "if applicable" prose- option
keys are short and stable, labels are free to reword; a multi question whose honest answer can be "none of these" gets that as its last option with"exclusive": true— never as prose in the intro - anything the schema does not know belongs in
meta, which is never rendered
Authoring the questions themselves (USWDS/GOV.UK evidence, baked into the design — your job is only the content):
- micro-topic sections, ordered simple → difficult: the section title is the subheading the person sees over each question
- amounts: ask "roughly how much" and accept what is typed — the page never
parses or normalizes a value, so
~1.200and500–800are valid answers - never mark anything optional and never make anything mandatory; Skip and Don't-know standing on every question carry that message
- the intro states up front that answers stay in the file's local storage, so people know they can close it and come back (the engine's footer and resume banner do this — don't repeat it in your intro text)
Strict JSON, no comments. Unknown keys are errors on purpose — a typo that
renders is a question nobody will ever see. The validator prints every
finding at once and a failing spec renders nothing, so render and read the
findings; open ${CLAUDE_PLUGIN_ROOT}/docs/spec-questionnaire.md only when a
finding or an advanced field needs the full schema.
3. Render and check
python3 .render/render.py --check
python3 .render/render.py --page survey:<spec-stem> # just this one
python3 .render/render.py --prune # drop orphaned pagesA spec that fails validation is not rendered — the run prints every finding and exits non-zero. Fix the spec; never work around the validator.
Then tell the person where the file is and let them open it. It is one self-contained file: it works offline, from a USB stick, in a browser with no network. Their answers stay in that browser until they copy them out.
4. Read the hand-back
The summary screen produces a text block behind a copy button. The person pastes it into the chat. Save the paste to a file (or pipe it in) and let the shipped parser do the mechanics — never parse it by eye:
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/handback.py" paste.txt # report
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/handback.py" paste.txt --json # as dataThe marker is auto-detected, the block is found inside a longer message, and
every item comes back with its state, answers and note. Exit 2 means no usable
block — usually a truncated copy; ask for the paste again. (The grammar lives
in ${CLAUDE_PLUGIN_ROOT}/docs/handback.md; you should not need it unless the
report surprises you.)
What to do with the result:
[q..]ids are the join key. Match them against your spec to reachmetaand anything else the page deliberately never showed.(key) Label— parse the key, quote the label back to the person.? don't know — please follow upis a real answer. It marks what to ask about next, in conversation, where a form was the wrong tool.(skipped)and(not answered)are different: one is a decision, the other is an absence. Neither is an error.- Notes matter most where the answer is weakest. A note on a skipped question is usually the reason it was skipped.
The paste may arrive with no skill running
A person pastes the block whenever they finish, which may be hours later, in a fresh session, with nothing loaded. Plan for it in the project's skill:
- give the marker a distinctive, project-specific name
(
"handback-marker": "ACME INTAKE ANSWERS") so it cannot collide - have the project skill's
descriptionname that exact marker, so a paste containing it is enough to select the skill - keep the routing rule in the project skill, not here
5. Iterating
Editing a spec re-renders only that page, and the answers already given survive:
they are keyed by the spec id, not by the file's contents. Changing the id
starts an empty page — so do not change it to fix a typo in the title.
Adding a question mid-flow is safe. Removing one drops it from the hand-back but leaves the rest untouched.
Never
- Never copy the questionnaire kind into a project. It lives in the engine and
is imported; a copy forks on day one and never receives a behaviour fix. If a
project needs a page type the plugin does not ship, it writes its own kind in
.render/kinds/<name>.py— a different thing from forking this one. - Never write project-side CSS or JS for these pages. The interactive
components, the state kit and the copy mechanics are in the design system; if
something is missing, it gets added there, documented in
design-manual.mdfirst (section 6b and 11). - Never make a question mandatory and never gate the hand-back on completeness. A questionnaire that demands everything gets abandoned; one that accepts a third of the answers gets finished later.
- Never put anything sensitive in a spec expecting it to stay hidden. The
page is a plain file;
metais invisible to the reader, not secret.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
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.

