14 KiB
Research Project Guidelines
Project Structure
ProjectName/
├── README.md # Project overview (public-facing)
├── LICENSE # MIT Transparency License
├── CLAUDE.md # AI assistant guidelines + project config
├── goals.md # Success criteria (what does "done" look like?)
├── spec.md # Technical specification (optional)
├── conclusions.md # Living findings document
├── open_questions.md # Unresolved questions tracker
├── .gitignore
├── experiments/ # Experiment code (numbered runs)
│ ├── run1-baseline.ext
│ ├── run2-variable-change.ext
│ └── ...
├── results/ # Experiment results documentation
│ ├── TEMPLATE-results.md # Template for new results docs
│ └── experiment_N_results.md # One per experiment group
├── data/ # Datasets (gitignored — large files)
├── literature/ # Paper notes & prior art
│ ├── TEMPLATE-paper.md # Template for paper reviews
│ └── paper-name.md
├── src/ # Implementation code (when research produces software)
├── tests/ # Test suite
├── docs/ # Technical documentation
│ ├── README.md # Docs index
│ ├── TEMPLATE-experiment-plan.md
│ ├── TEMPLATE-milestone.md
│ ├── getting-started.md
│ └── architecture.md
└── screenshots/ # Visuals for README / portfolio
TeamIDE Project Management
If this project was scaffolded from Ideation, .teamide/ PM files (plans, tasks, project.yml) should already exist — generated from milestone definitions during scaffolding. See the Ideation workspace's claude.md for the PM generation workflow and format details.
Terminology
| Term | Meaning |
|---|---|
| goals.md | What success looks like — pass/fail criteria, anti-goals, kill gates |
| spec.md | Technical specification for the system being built or studied (optional) |
| conclusions.md | Living findings — updated after each experiment phase |
| open_questions.md | Unresolved questions with context and leads |
| experiment | A numbered run in experiments/ with a hypothesis |
| results doc | Structured write-up in results/ documenting what happened |
| milestone | A dependency-tracked unit of work with success criteria |
The Research Pipeline
Vision doc --> Math/tradeoff analysis --> Milestone plan --> Implementation --> Tests pass
(speculative) (constrained) (prescriptive) (code) (done)
Each stage has a different document type and level of commitment. Ideas flow left to right and can be killed at any stage.
Document Layers
Layer 1: Vision Documents
Thinking documents. Speculative, conversational, organized around questions and hypotheses. These live at the repo root or in topic-specific folders.
Purpose: Capture the frontier of thinking. These are allowed to be wrong.
Examples: Mathematical explorations, system architecture visions, training/data blueprints, goal documents.
Layer 2: Specs & Plans
Prescriptive. Designed to be turned directly into implementation tasks. Live in docs/ or as top-level files (spec.md).
Purpose: Bridge between "what if" and "what to build." Every spec includes tasks, API surface, success criteria, and test cases.
Layer 3: Research Subprojects
Active investigations with clear experiment plans and validation gates. Each gets its own directory or subfolder within experiments/ with a README explaining the hypothesis, experiment design, and expected outcomes.
Layer 4: Architecture Docs
Written after implementation. Describe how things actually work, not how they were planned. Live in docs/architecture.md.
Purpose: Let a new developer understand the system without reading source code.
Key Patterns
1. Hypothesis First (Non-Negotiable)
Every experiment requires a written hypothesis before any code runs. No hypothesis, no experiment.
The hypothesis states what you expect to happen and why — it forces you to think before you compute.
## Hypothesis
Increasing batch size from 1 to 32 will reduce gradient noise enough for
convergence, because individual gradient samples have high variance but
batch-averaged gradients should be stable.
## Expected Outcome
Loss should decrease monotonically with batch=32, vs oscillating with batch=1.
If loss still oscillates with batch=32, the variance problem is fundamental,
not just a sample-size issue.
Without a hypothesis, you don't know what the experiment is testing. You'll see a number and not know if it's good or bad.
The scientific method, applied:
- Observe — notice something in your data, results, or literature
- Question — formulate a specific question about what you observed
- Hypothesize — predict an answer and state WHY you expect it
- Experiment — design a run that can confirm or reject the hypothesis
- Analyze — compare results to the prediction
- Conclude — state what was learned, update your mental model
- Repeat — the conclusion feeds the next observation
2. Kill Gates
Research questions get structured investigation with kill gates:
Phase 1: Literature review (what exists?)
Phase 2: Build minimal viable module
Phase 3: Integration experiments (defined matrix of configs)
Phase 4: Investigate properties (hypothesis-based, only if Phase 3 passes)
Phase 5: Optimization (only if Phase 4 is promising)
Each phase is a gate. If Phase 3 fails, Phase 4 doesn't happen. This prevents sunk-cost fallacy on dead-end research.
3. Constraint-Driven Design
Start with hard limits. Let them drive architecture.
## Constraints
- [Your hardware/budget/time limit here]
- [Your performance requirement here]
- [Your compatibility requirement here]
## Design (driven by above)
- [Architecture decision that follows from constraints]
Don't design the ideal system then optimize. Design around your actual constraints from day one.
4. Explicit Deferral
Every milestone says what it's NOT doing and why:
**Deferred:** [Feature/capability].
**Reason:** [Why it's not worth doing now].
Three categories for all work items:
- Active/Concrete — being built now, with tests
- Outlined — architectural sketch, no code yet
- Deferred — recognized need, explicitly postponed with rationale
This prevents scope creep while preserving ideas for later.
5. Tradeoff Tables
Every complex decision gets a table showing the option space:
| Option | Pros | Cons | When to pick |
|-----------|------------------|-----------------------|----------------|
| Option A | Simple, fast | Doesn't scale past N | Prototyping |
| Option B | Scales well | Complex to implement | Production |
| Option C | Best performance | Vendor lock-in | If budget > $X |
No "we chose X because it's better." Instead: "here's the tradeoff space, here's what we picked and why."
6. Testable Success Criteria
Every milestone ends with a concrete, falsifiable statement:
**Success Criteria:**
- [System] does [specific thing] in [specific time/resource bound]
- [N] tests pass with zero warnings
- [Specific scenario] produces [specific measurable result]
Not "it should work" — specific numbers, specific scenarios.
7. Math First, Code Second
Abstract ideas get mathematical or formal framing before any code is written:
Idea (what if we tried X?)
--> Formalization (what does X actually mean mathematically?)
--> Existing work (has anyone done this? what libraries exist?)
--> Experiment plan (how would we test this?)
--> Validation gate (what result would make us continue vs abandon?)
This filters out ideas that sound good but don't survive formalization.
8. Documentation as Specification
Write implementation-ready docs before coding:
- Write detailed spec in markdown (API signatures, wire formats, data structures)
- Implement against the spec
- Test against the spec's success criteria
- Update the spec if reality diverges
The spec IS the source of truth. Code follows docs, not the other way around.
Experiment Tracking
All experiments live in the experiments/ folder and follow strict naming and documentation conventions.
Naming Convention
Experiments are numbered sequentially with a descriptive kebab-case suffix:
experiments/
├── run1-batch-gradient-baseline.c
├── run2-per-sample-online.c
├── run3-leaky-relu-activation.c
├── run4-temperature-annealing.c
└── ...
Rules:
- Prefix:
run<N>-where N is sequential (run1, run2, run3...) - Suffix: short kebab-case description of what this run changes vs the previous
- One variable changed per run when possible (isolation)
- If a run is a variant of another, use sub-numbering:
run9b-normalization-lower-temp - Run numbering stays globally sequential across the whole project — don't restart at run1 inside subfolders
When a single experiment direction spawns many runs, group them in a subfolder inside experiments/:
experiments/
├── run1-baseline.ext
├── run2-different-approach.ext
├── scaling-study/ # Subfolder for related runs
│ ├── run3-small-scale.ext
│ ├── run4-medium-scale.ext
│ └── run5-large-scale.ext
└── ...
Results Documentation
Every experiment's results are documented in results/. One results file per experiment or per logical group:
results/
├── experiment_1_results.md
├── experiment_2_results.md
└── ...
Use results/TEMPLATE-results.md as the starting point for each results file.
Key Rules for Results
- Every run gets a row in the summary table — even failed runs. Especially failed runs.
- Link to source files — reference experiment files as
experiments/run1-descriptive-name.ext - Include raw output — paste actual terminal output. Don't just summarize.
- One finding per discovery — each finding gets its own subsection with a bold Verdict line
- Comparison tables for pivots — when switching approaches, add a side-by-side comparison table
- Strikethrough completed next steps — mark done items with
~~strikethrough~~and add DONE - Decision points with kill gates — define upfront what results would make you continue, pivot, or abandon
- Literature context — compare your results to published work
Running Experiments
All experiments MUST be run in the background so the user can continue chatting while they execute. Never run a build or training run in the foreground — it blocks the conversation. Use background execution and check on results later.
Milestone Format
Every implementation milestone follows this structure:
### Milestone X.Y: Title — [STATUS]
**What:** One-sentence summary of the deliverable.
**Tasks:**
- [ ] Task with enough detail that someone else could do it
- [ ] Another task
**Completed.** [Summary paragraph when done.]
**Deferred:** [What was intentionally left out and why.]
**New Files:**
| File | What |
|------|------|
| path/to/file | One-line description |
**API Surface:**
[Function signatures or interface definitions]
**Depends on:** Milestone X.Y-1
**Success Criteria:** [Falsifiable statement with numbers]
**Test Cases:**
1. [Specific scenario] — [expected result]
2. [Specific scenario] — [expected result]
Dependency Graphs
Milestones form a dependency chain. Visualize it:
Phase 1: 1.1 --> 1.2 --> 1.3 --> 1.4 --> 1.5
| |
Phase 2: v v
2.1 --> 2.2 --> 2.3 --> 2.4
This makes it obvious what can be parallelized and what blocks what.
Principles
- Hypothesis before experiment — no code runs without a written prediction of what will happen and why. This is the most important rule.
- Speculation is welcome but quarantined — vision docs are clearly marked as exploratory
- Implementation follows specs — not the reverse
- Deferral is first-class — saying "not now" with a reason is as important as saying "yes"
- Constraints are features — limits drive creative solutions rather than being obstacles
- Tests are the definition of done — not "it compiles" but "N tests pass with zero warnings"
- Tradeoffs are documented — future-you can understand why decisions were made
- Kill gates protect your time — research that fails a gate gets abandoned, not propped up
- Every experiment is tracked — numbered, named, with raw output in results files. Failed runs are documented just as thoroughly as successes.
- One variable per run — isolate changes so you know what caused the result. Sub-number variants (run9b) when testing minor tweaks.
- Experiments run in the background — never block the user's ability to chat. All builds, training runs, and long-running processes execute in the background.
Commit Rules
- Never mention Claude, AI, or generated code in commits
- Write as the developer, first person
- Concise and descriptive
Customization Checklist
When creating a new project from this template:
- Update
README.mdwith project name, problem, idea, approaches - Fill in
goals.mdwith success criteria from the project plan - Fill in
spec.mdif the project has a technical specification (otherwise delete it) - Set up
open_questions.mdwith initial research questions - Create initial experiment plans in
docs/usingTEMPLATE-experiment-plan.md - Add project-specific entries to
.gitignore(language-specific, data formats, etc.) - Update the "Project-Specific Configuration" section below
- Initialize git and create GitHub repo
Project-Specific Configuration
Project Name
[PROJECT_NAME]
Description
[Brief description of the research project]
Research Question
[The core question this project investigates]
Tech Stack
[Languages, frameworks, libraries being used]
TeamIDE Workspace ID
[Workspace ID if deployed via TeamIDE]