research-design-helper
Skill67 starsChanged 7 months agoMITView on GitHub
Guide a researcher through 5 Socratic segments — research question sharpening, expected mechanism, identifiability check, validation plan, risk register — and produce `.research/design_brief.md`. Use when the user asks to "frame this research question", "design my study", "help me think through what model to build", "sharpen my hypothesis", "is my research question sharp enough to be falsifiable?", or "before I start coding, walk me through the design". Runs AFTER a topic is chosen — it designs the study for a given question; to decide whether a research gap is worth pursuing at all (open / a contribution / feasible), use `gap-to-topic`. Does NOT write the model spec; does NOT invent the research question — guides the human to articulate them.
- Installs packages
In this repository14 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- research-hubSkill
- gap-to-topicSkill
- literature-triage-matrixSkill
- notebooklm-brief-verifierSkill
- paper-memory-builderSkill
- paper-summarizeSkill
- research-context-compressorSkill
- research-hub-multi-aiSkill
- research-hubSkill
- research-project-orienterSkill
- research-workflow-orchestratorSkill
- zotero-library-curatorSkill
The file
We split this skill into the rules it gives an agent
10 rules. About 0 are common, 6 are distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈6
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 40
Do NOT scan code, data, or PDFs.
- Very specific: line 46
Before starting the Socratic dialog, check whether .research/topic_dossier.gaps.yml exists.
- Very specific: line 79
Use the template at references/design_brief_template.md (sibling file in this skill).
- Distinctive: line 88
If the file already exists, update don't replace: keep human-edited sections intact, only fill blanks unless the user explicitly says …
- Distinctive: line 96
After saving, print a short report:
- Very specific: line 109
After writing .research/design_brief.md, an optional Word version can be generated via the sister script at scripts/brief_to_docx.js.
- Distinctive: line 137
Don't repeat the user's answers back at length — quote in the written brief, summarize one sentence in chat.
- Distinctive: line 138
Don't dump the whole template into the chat — write the file, then report which sections were filled.
- Distinctive: line 143
Do NOT invent the research question: If the user is vague, surface the vagueness.
- Very specific: line 147
Do NOT skip segments silently: If a segment is blank, the brief must say _TODO_ so future sessions (or the orienter) can flag it.
≈ “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
research-design-helper
Stage 3a (sharp problem framing) and front-of-Stage 4 (model design) helper. Part of the research-hub skill pack — works alongside Zotero, Obsidian, and NotebookLM workflows but does not require any of them. Domain-agnostic Socratic guide that walks a researcher through 5 short segments and saves the result as .research/design_brief.md.
The skill does not invent your research question or model design. Like research-context-compressor, it leaves blanks rather than guess. Its value is structured prompting: forcing you to articulate what you'd otherwise leave implicit, before you spend weeks coding.
When to use
Trigger phrases:
- "Frame this research question."
- "Design my study before I start coding."
- "Help me think through what model to build."
- "Sharpen my hypothesis."
- "Walk me through the design."
- "Build a design brief."
Not for:
- Writing actual model code (that's the user's work, optionally with
codex-delegatefor boilerplate). - Project context manifests (that's
research-context-compressor). - Literature comparison (that's
literature-triage-matrix). - Manuscript writing (that's
academic-writing-skills).
Inputs
In priority order:
.research/project_manifest.ymlif it exists — for project context (research_question may already be partially filled)..research/topic_dossier.gaps.ymlif it exists — Stage 2 handoff fromgap-to-topic(plugin v0.3.12+). Inspect candidate IDs/names/verdicts to identify eligible options; after the user's actual selection, read only thatgaps[]entry plus top-levelopen_questions[], NOT the whole corpus.goandconditional-goare eligibility assessments, not proof of selection. Use a clear prior user choice without asking again; if absent or ambiguous, ask even when only one candidate is eligible. The workflow §0 then pre-fills segment 1 (RQ) fromgaps[].statementand segment 5 (risks) fromopen_questions[]+gaps[].feasibility. If supplied, also read that selected candidate's optional.research/topic_dossier.direction-review.jsonrecord and applicable resource records as described below; its absence does not block the legacy dialogue..research/design_brief.mdif it exists — for refresh, not first-run..research/literature_matrix.mdif it exists — for prior-art context when discussing identifiability.- The user's free-text answers during the conversation.
Do NOT scan code, data, or PDFs. This is a conversational skill.
Workflow
§0 — Detect Stage 2 handoff (gap-to-topic)
Before starting the Socratic dialog, check whether .research/topic_dossier.gaps.yml exists.
- If absent → behave exactly as before (skip to the 5-segment table below; no regression for users who run this skill standalone).
- If present → filter
gaps[]to entries withverdictin{conditional-go, go}as assessed eligible options. Ano-gois an assessment, not a user's decision to reject it. Preserve actual user choice; do not infer it from a verdict, a single option or packet validity. Then:- Filtered list has exactly one entry → it is eligible, not automatically chosen. If no clear prior user selection exists, ask "Would you like to design this candidate, or revisit the options?" before writing a brief. Only after the user selects it, auto-pre-fill:
- Segment 1 (RQ) ← write
gaps[].statementverbatim into the Sharpened RQ field, replacing the template's_TODO_placeholder. Do not add any_PRE-FILL_-style annotation inside the file content — the chat message below is where you signal "this is pre-fill, sharpen me". Keeping the file content clean means segment 1 dialog can simply overwrite the statement with the sharpened RQ; no later cleanup step is needed. The Falsification condition and Smallest answerable version sub-fields stay_TODO_— those only get filled during segment 1 dialog. - Segment 5 (Risk register) ← one row per entry in
open_questions[], plus a row for the specific concern indicated bygaps[].feasibility(e.g.feasible-with-effort→ a "binding constraint" risk row). - Tell the user (chat message, not in the file): "I pre-filled segment 1 (RQ) from
gaps[<id>].statementand segment 5 (risks) fromopen_questions[]+ thefeasibility: <value>hint. Segment 1's Sharpened RQ is a starting point — segment 1 dialog will sharpen it into an answerable form appropriate to your field. Review and revise as we walk through."
- Segment 1 (RQ) ← write
- Filtered list has 2+ entries → use an actual prior user selection if clear; otherwise ask "Which candidate are we designing for?" before pre-filling. Do not invent a selection or choose by score/order.
- Filtered list is empty → explain "No viable candidate has been assessed in this dossier yet." Give the reasons and a bounded revision/reassessment path; do not treat unknown as a demonstrated scientific failure or claim the user rejected every idea. Do not auto-start a design brief.
- Explicit user choice names a
no-gooption → preserve that actual choice and surface the blocking assessment; discuss revision/reassessment before treating it as design-ready. Never silently substitute another candidate.
- Filtered list has exactly one entry → it is eligible, not automatically chosen. If no clear prior user selection exists, ask "Would you like to design this candidate, or revisit the options?" before writing a brief. Only after the user selects it, auto-pre-fill:
- Segments 2 (mechanism), 3 (identifiability), 4 (validation) are NEVER pre-filled. The
.gaps.ymldoesn't carry that material; pre-filling those segments with non-content corrupts the Socratic dialog. Leave them blank →_TODO_until the segment runs. - Provenance. When you write
.research/design_brief.md, fill the frontmattersource:field withtopic_dossier.gaps.yml#<gap-id>(e.g.topic_dossier.gaps.yml#G2) and thegap_verdict:field with a frozen snapshot ofverdict+ the first 60 chars ofverdict_reason. This makes the brief self-contained — a future reader sees which dossier candidate this design was framed for. - Optional direction-review handoff. For the selected candidate, preserve the supplied
candidate_version, reviewed candidate-content hash, review path, and unresolved material/resource limitations in the brief's Notes. Missing versions stay unknown; do not assume version 1. A missing review leaves the standalone/legacy dialogue available. A stale candidate version/content binding or changed source bytes requires rechecking the affected assessment before relying on it; keep the old record and do not silently carrysupportedforward. Carryunknown/contradicteditems, their reasons and bounded next checks into the risk discussion; a justifiednot-applicableis valid for work that does not need that prerequisite. If binding has not been checked, say so rather than treating a matching ID as verification. The checker only checks supplied records, source-byte bindings and resource estimates: it does not establish semantic support, select the candidate, authorize execution or prove scientific feasibility.within-estimateis not verified runtime spending. Seedocs/direction-review-contract.mdin the research-hub repository for the optional checker contract.
§1 to §5 — the 5 Socratic segments
Run the 5 Socratic segments in order, one at a time. For each, ask the listed questions, capture the user's answer, then save verbatim to the corresponding section of .research/design_brief.md. If the user can't answer a segment yet, write _TODO: <reason>_ and move on; do not fabricate.
Adapt the prompts to the research type. Do not require an empirical study, hypothesis, causal mechanism, predictive model or LLM; a justified not-applicable is preferable to inventing one. Preserve the five section headings, using field-appropriate questions about evidence or argument where needed. An unresolved answer is _TODO_, not not-applicable. Explicitly record the intended claim and time boundary, a matched-information comparison where applicable, the researcher's minimum worthwhile gain, and the smallest answerable version with its nonclaims. Narrowing countries, periods, populations or objectives requires the user's choice. Only describe a reduced design as expected executable when its necessary materials, essential comparisons and resource needs fit confirmed available resources; otherwise record the constraint and next check. A fixed duration or successful prototype is not a universal feasibility threshold.
Segments + their prompts: references/socratic-segments.md.
| # | Segment | What it produces |
| 1 | Research question sharpening | answerable RQ + claim/time boundary + smallest answerable version and nonclaims |
| 2 | Expected mechanism | mechanism or argument + uncertainty annotations, as applicable |
| 3 | Identifiability check | discriminating evidence + alternative explanations + missing-material plan |
| 4 | Validation plan | assessment criterion + matched-information comparator + minimum worthwhile gain + control, as applicable |
| 5 | Risk register | 3–5 risks each with early-warning + mitigation |
Output: .research/design_brief.md
Use the template at references/design_brief_template.md (sibling file in this skill). Fill the 5 sections with the user's answers verbatim. Frontmatter is required:
project: <from project_manifest.yml or asked at start>
last_updated: <ISO date>
stage: design
status: draft # draft | reviewed | lockedIf the file already exists, update don't replace: keep human-edited sections intact, only fill blanks unless the user explicitly says "regenerate from scratch".
Provenance protection (v0.3.12+). If the existing design_brief.md has frontmatter source: topic_dossier.gaps.yml#<old-id> and a different gaps[] entry is now being chosen (different id, OR .gaps.yml generated: date differs), ASK the user before refreshing — do not silently overwrite provenance. Phrasing: "This brief was originally framed for <old-id> (<old-verdict>). You have now chosen <new-id> (assessed <new-verdict>) from the current .gaps.yml. Refresh and replace the provenance, or keep the old brief and start a new one?"
Apply the same protection when a recorded candidate version or candidate-content hash changes. Preserve human-edited answers and the previous review limitations; ask before replacing provenance, and leave affected design claims unresolved until the revised materials have been checked. Do not silently change the research question to fit a budget or an available outcome.
Placeholder marker (v0.3.15+). When any segment is filled with test-fit / dogfood placeholder content (e.g. an AI-generated stub written to exercise the Stage 3a → 3b wire without a real Socratic dialog), record those segment numbers in the frontmatter placeholder_segments: list. Example: placeholder_segments: [2, 3, 4] means segments 2–4 are placeholders, not from the researcher's actual answers. Downstream tools should refuse to gate real research on a brief with non-empty placeholder_segments. When all 5 segments are filled by genuine Socratic dialog, leave the list empty ([]). This pattern was added after the v0.3.12 dogfood, where segments 2–4 were written as test-fit content to validate the wire — a future reader needs a machine-checkable signal that those segments aren't advisor-ready.
After saving, print a short report:
[research-design-helper]
Wrote: .research/design_brief.md
Sections completed: 4 / 5 (Risk register marked _TODO_ — circle back)
Strongest spot: Identifiability check — clear discrimination via negative control.
Weakest spot: Validation plan — baseline not yet specified.
Suggested next: refine the validation baseline, then re-run with "regenerate from scratch" to lock the brief.Generate .docx (optional, plugin v0.3.14+)
After writing .research/design_brief.md, an optional Word version
can be generated via the sister script at
scripts/brief_to_docx.js. The .docx is a convenience for sharing the
brief with advisors / committee members who prefer Word — it is NOT
part of the contracted Stage 3a output and is not consumed by
downstream skills (Stage 3b reads design_brief.md frontmatter + §1
directly).
# From the directory that contains design_brief.md:
node /path/to/skills/research-design-helper/scripts/brief_to_docx.js design_brief --no-toc
# zh-TW variant (auto-selects Microsoft JhengHei):
node /path/to/skills/research-design-helper/scripts/brief_to_docx.js design_brief.zh-TW --no-tocPrerequisite: npm install -g docx (one-time). The --no-toc flag is
recommended for design briefs — they're typically short enough that
Word's auto-generated empty TOC field is more distracting than useful.
The script is a near-byte copy of the gap-to-topic
scripts/dossier_to_docx.js generator (same Markdown → Word logic,
same font auto-selection, same separator-row skip). The dossier's
verdict-colour regex is inherited verbatim but does not fire on design
brief content — see scripts/README.md for the rationale.
Token-saving behavior
- Don't repeat the user's answers back at length — quote in the written brief, summarize one sentence in chat.
- Don't dump the whole template into the chat — write the file, then report which sections were filled.
- Skip segments the user can't answer; record
_TODO_and move on. The point is not to complete every section in one session — it's to surface the gaps.
What NOT to do
- Do NOT invent the research question. If the user is vague, surface the vagueness; do not fill it in for them.
- Do NOT propose model architectures or technologies. That's Stage 4 implementation work, owned by the user with help from
codex-delegatefor boilerplate. This skill stops at the spec. - Do NOT write to
.paper/— that'spaper-memory-builder. - Do NOT touch
.research/project_manifest.yml— that'sresearch-context-compressor. The two are complementary; the manifest captures STATE, the brief captures DESIGN INTENT. - Do NOT skip segments silently. If a segment is blank, the brief must say
_TODO_so future sessions (or the orienter) can flag it.
See also
references/socratic-segments.md— full prompts for each of the 5 segmentsreferences/design_brief_template.md— Markdown template for the output file
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
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.

