with one click
science-add-hypothesis
// Develop and refine a research hypothesis interactively. Use when the user wants to add a hypothesis, formalize a conjecture, or organize uncertain propositions around one research direction.
// Develop and refine a research hypothesis interactively. Use when the user wants to add a hypothesis, formalize a conjecture, or organize uncertain propositions around one research direction.
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | science-add-hypothesis |
| description | Develop and refine a research hypothesis interactively. Use when the user wants to add a hypothesis, formalize a conjecture, or organize uncertain propositions around one research direction. |
Converted from Claude command /science:add-hypothesis.
Before executing any research command:
Resolve project profile: Read science.yaml and identify the project's profile.
Use the canonical layout for that profile:
research → doc/, specs/, tasks/, knowledge/, papers/, models/, data/, code/software → doc/, specs/, tasks/, knowledge/, plus native implementation roots such as src/ and tests/Load role prompt: .ai/prompts/<role>.md if present, else references/role-prompts/<role>.md.
Load the science-research-methodology and science-scientific-writing Codex skills. If native skill loading is unavailable, use codex-skills/INDEX.md to map canonical Science skill names to generated skill files and source paths.
Read specs/research-question.md for project context when it exists.
Load project aspects: Read aspects from science.yaml (default: empty list).
For each declared aspect, resolve the aspect file in this order:
aspects/<name>/<name>.md — canonical Science aspects.ai/aspects/<name>.md — project-local aspect override or additionIf neither path exists (the project declares an aspect that isn't shipped with
Science and has no project-local definition), do not block: log a single line
like aspect "<name>" declared in science.yaml but no definition found — proceeding without it and continue. Suggest the user either (a) drop the
aspect from science.yaml, (b) author it under .ai/aspects/<name>.md, or
(c) align the name with one shipped under aspects/.
When executing command steps, incorporate the additional sections, guidance, and signal categories from loaded aspects. Aspect-contributed sections are whole sections inserted at the placement indicated in each aspect file.
Check for missing aspects: Scan for structural signals that suggest aspects the project could benefit from but hasn't declared:
| Signal | Suggests |
|---|---|
Files in specs/hypotheses/ | hypothesis-testing |
Files in models/ (.dot, .json DAG files) | causal-modeling |
Workflow files, notebooks, or benchmark scripts in code/ | computational-analysis |
Package manifests (pyproject.toml, package.json, Cargo.toml) at project root with project source code (not just tool dependencies) | software-development |
If a signal is detected and the corresponding aspect is not in the aspects list,
briefly note it to the user before proceeding:
"This project has [signal] but the
[aspect]aspect isn't enabled. This would add [brief description of what the aspect contributes]. Want me to add it toscience.yaml?"
If the user agrees, add the aspect to science.yaml and load the aspect file
before continuing. If they decline, proceed without it.
Only check once per command invocation — do not re-prompt for the same aspect if the user has previously declined it in this session.
Resolve templates: When a command says "Read .ai/templates/<name>.md",
check the project's .ai/templates/ directory first. If not found, read from
templates/<name>.md. If neither exists, warn the
user and proceed without a template — the command's Writing section provides
sufficient structure.
Resolve science CLI invocation: When a command says to run science,
prefer the project-local install path: uv run science <command>.
This assumes the root pyproject.toml includes science as a dev
dependency installed via uv add --dev --editable "$SCIENCE_TOOL_PATH"
(the distribution is science; the entry point it installs is science).
If that fails (no root pyproject.toml or science not in dependencies),
fall back to:
uv run --with <science-plugin-root>/science science <command>
Develop a structured hypothesis from the user's input in the user input.
In this project, a hypothesis is an organizing conjecture, not a settled fact. Treat it as a bundle of uncertain propositions that may later gain or lose support.
Follow the Science Codex Command Preamble before executing this skill. Use the research-assistant role prompt.
Additionally:
docs/proposition-and-evidence-model.md..ai/templates/hypothesis.md first; if not found, read templates/hypothesis.md.specs/hypotheses/ to avoid duplication.doc/questions/ — the new hypothesis may address an existing open question.Have a natural conversation with the user to develop the hypothesis. The questions below are guidelines — use judgment based on how much context the user has already provided.
Try to separate:
For each important proposition, identify:
empirical_regularity, causal_effect, mechanistic_narrative, or structural_claimIf a proposition relies on an indirect proxy, note that early and record the likely measurement_model rather than treating the proxy as direct evidence.
If the hypothesis has genuinely competing structural readings, note the likely rival-model packet:
current_working_model only if one already existsAfter the conversation, create the hypothesis with science hypothesis create. The tool assigns the next sequential hNN ID, places the file under specs/hypotheses/, and writes canonical frontmatter (id, type, title, status, related, source_refs, created, updated). It also runs prospective validation against the project's audit rules — unresolved references emit warnings, structural problems block.
uv run science hypothesis create "<short title>" \
--related <question:qNN-...> \
--related <hypothesis:hMM-...> \
--source-ref <paper-or-package-ref>
The command prints the chosen ID (e.g. hypothesis:h03-short-title) and the file path. Do NOT pre-write the file or hand-pick the ID — let the tool sequence and validate. If the user wants a specific slug, pass --slug <slug>; if they need a literal ID, pass --id hypothesis:<local-part>.
After the file is created, open it and fill in the body using .ai/templates/hypothesis.md first, then templates/hypothesis.md as the writing reference. Preserve the frontmatter science produced; only edit the body. Use science hypothesis edit <ref> (or science entity edit <ref>) for later metadata changes — both run prospective validation and update updated automatically.
Write the hypothesis as:
Do not frame a single paper or result as proving the hypothesis.
h prefix: h01-short-title.md, h02-short-title.md, etc. (assigned by science hypothesis create).id: matches the filename stem: "hypothesis:h01-short-title".H prefix: H01, H02, etc.science hypothesis create defaults status to proposed. The supported life-cycle values are proposed, under-investigation, partially-supported, supported, weakened, and refuted. Use --status under-investigation only if active testing is already underway. Avoid supported, weakened, or refuted as the default outcome of authoring a new hypothesis — those are evidence-based exit states.
Use optional layered-claim fields only when they reduce ambiguity, by editing the file body and frontmatter after creation:
claim_layeridentification_strengthmeasurement_modelsupports_scope as a review hint, not as a graph overriderival_model_packetscience entity edit <question-ref> --related hypothesis:h<NN>-<short-title>. (Or update the question body in place if it needs prose changes.)science-specify-model.science-pre-register.git add -A && git commit -m "hypothesis: add H<NN> - <short title>"Reflect on the template and workflow used above.
If you have feedback (friction, gaps, suggestions, or things that worked well), report each item via:
science feedback add \
--target "command:add-hypothesis" \
--category <friction|gap|guidance|suggestion|positive> \
--summary "<one-line summary>" \
--detail "<optional prose>"
Guidelines:
--target "template:<name>" instead