DD012: Design Document RFC Process (How Decisions Are Made)¶
- Status: Proposed (Governance)
- Author: OpenWorm Core Team
- Date: 2026-02-14
- Supersedes: Informal decision-making
- Related: DD011 (Contributor Progression), AI-Augmented Open Science Proposal
Phase: Infrastructure Bootstrap | Layer: Governance
Context¶
Currently, architectural decisions in OpenWorm happen through:
- Informal Slack discussions
- GitHub issue debates
- Private conversations
- Founder's judgment
This creates problems:
- Decisions are not documented (newcomers re-propose rejected approaches)
- Rationale is lost (future contributors don't know why decisions were made)
- No clear process for contributors to propose changes
- Founder becomes bottleneck for all decisions
The Rust project's RFC (Request for Comments) process provides a proven model for preserving vision while distributing decision-making. Python's PEP (Python Enhancement Proposal) system serves a similar function.
Decision¶
All Major Architectural Decisions Must Be Documented as Design Documents¶
A "major architectural decision" is any change that:
- Affects multiple subsystems
- Changes a fundamental modeling approach (e.g., switching from HH to FitzHugh-Nagumo)
- Adds a new data source or validation target
- Changes contributor workflows or policies
- Has long-term implications (difficult to reverse)
Not major: Bug fixes, parameter tuning within documented ranges, documentation improvements, refactoring that preserves behavior.
Design Document Template¶
Every Design Document follows this structure. Lead with impact, end with background. A contributor reading top-to-bottom should answer "what do I build?" on page 1, not page 5.
# DD###: Title
- **Status:** Proposed | Accepted | Superseded | Rejected
- **Author:** Name(s)
- **Date:** YYYY-MM-DD
- **Supersedes:** DD### (if applicable)
- **Related:** DD### (cross-references)
> **Phase:** [Phase X](DD_PHASE_ROADMAP.md#phase-x-...) | **Layer:** [layer name]
## TL;DR ← REQUIRED
2-3 sentences. What this DD does, why it matters,
and the single most important success metric.
## Goal & Success Criteria ← REQUIRED
- Which [DD010](DD010_Validation_Framework.md) validation tier does this improve?
- Quantitative success metric (threshold, not vague)
- Before/after: what simulation gains
## Deliverables ← REQUIRED
- Exact files on disk (paths relative to repo root)
- File formats
- Example content snippet or schema
## Repository & Issues ← REQUIRED
- GitHub repo (e.g., `openworm/c302`)
- Issue label convention (e.g., `dd005`)
- Milestone link
- Example PR title
## How to Build & Test ← REQUIRED
### Prerequisites
- Docker with `docker compose`, OR list every native
tool with versions (language runtime, compiler, SDK)
### Getting Started (Environment Setup) ← REQUIRED
- Which repositories to clone (full `git clone` URLs)
- **Path A — Docker (recommended for newcomers):**
`docker compose build`, then which Step to skip to
- **Path B — Native:** exact `pip install` / `apt install`
/ `brew install` commands for all dependencies
- If this DD shares a repo with another DD (e.g., DD002
shares c302 with DD001), say so and cross-reference
the other DD's setup
- Platform-specific notes if applicable (e.g., OpenCL
availability, macOS vs Linux differences)
### Step-by-step
- Copy-pasteable commands numbered Step 1, 2, ...
- Expected output at each step
- Clearly label which steps are native-path vs Docker-path
### Green light criteria
- What "success" looks like (quantitative where possible)
### Scripts that don't exist yet
- Mark [TO BE CREATED] with a GitHub issue link
## How to Visualize ← REQUIRED
- Which [DD014](DD014_Dynamic_Visualization_Architecture.md) viewer layer displays this work
- Color mapping or rendering specification
- What you should SEE when it works correctly
- (If not applicable, e.g., governance DDs: state "N/A")
## Technical Approach ← REQUIRED
(The science/engineering — models, equations,
parameters, algorithms. Renamed from "Decision.")
## Alternatives Considered ← REQUIRED
What other approaches were evaluated?
Why were they rejected?
## Quality Criteria ← REQUIRED
How will we know if an implementation is correct?
What tests must pass? What validation is required?
## Boundaries (Explicitly Out of Scope) ← REQUIRED
What does this DD NOT cover?
## Context & Background ← REQUIRED
Why is this decision needed? Biological background,
prior art, project history. (Moved from top —
contributors who need action first, context second.)
## Implementation References ← OPTIONAL
Code locations, data sources, external documentation.
## Migration Path ← OPTIONAL
If this decision changes in the future, how do we
transition?
## References ← REQUIRED
Papers, datasets, external documentation.
## Integration Contract ← REQUIRED
(See expanded requirements below)
Integration Contract Required Sub-Sections¶
Every science/infrastructure DD's Integration Contract MUST include:
## Integration Contract
### Inputs / Outputs
Tables of what this subsystem consumes and produces.
Each row: Input/Output name, Source/Consumer DD,
Variable name, Format, Units, Timestep (if applicable).
### Repository & Packaging
- Primary repository (e.g., `openworm/c302`)
- Docker stage in multi-stage build ([DD013](DD013_Simulation_Stack_Architecture.md))
- `versions.lock` key
- Build dependencies (pip/apt packages)
### Configuration
- `openworm.yml` section with all keys documented
- Default values and valid ranges
### How to Test (Contributor Workflow)
- `docker compose run quick-test` — what it checks
- `docker compose run validate` — which [DD010](DD010_Validation_Framework.md) tiers
block merge
- Per-PR checklist (what must pass before merge)
### How to Visualize ([DD014](DD014_Dynamic_Visualization_Architecture.md) Connection)
- Which OME-Zarr groups this DD's output populates
- Which viewer layer displays it
- Color mapping specification
### Coupling Dependencies
- Upstream: what I depend on, what breaks if they change
- Downstream: who depends on me, what breaks if I change
RFC Workflow (Rust-Style)¶
Step 1: Proposal
- Anyone (L1+) can propose a Design Document
- Open a PR to
openworm-admin/design_documents/with a new DD file - Assign a DD number (next available, e.g., DD013)
- Tag relevant subsystem maintainers (L4) for review
Step 2: Discussion
- Community discusses in PR comments
- Author revises based on feedback
- Subsystem maintainer (L4) facilitates discussion, ensures all concerns are addressed
Step 3: Decision
- For subsystem-specific DDs: L4 maintainer makes final decision (approve/reject/request-changes)
- For cross-cutting DDs: L4 maintainers reach consensus; if conflict, founder (L5) arbitrates
- For governance DDs: Founder decides after community input
Step 4: Approval
- Status changed to "Accepted"
- PR merged
- DD becomes binding
Step 5: Implementation
- Code changes to implement the DD are tracked separately (GitHub issues, milestones)
- Implementation PRs reference the DD number
- Mind-of-a-Worm checks that implementation PRs comply with the DD
Step 6: Phase Synchronization
When a DD is created, approved, or changes phase assignment:
- DD Author sets the
> **Phase:**line in the DD header to match the Phase Roadmap - Integration L4 (or Founder) updates
DD_PHASE_ROADMAP.md: - Add or update the DD in the correct phase's Scope table
- Update cumulative metrics if cell counts change
- Integration L4 updates
INTEGRATION_MAP.md: - Update the Phase Legend table
- Update coupling chain phase annotations if data flow changes
- DD Issue Generator (DD015 §2.2) regenerates issues with
- **Roadmap Phase:**tags matching the new phase - Mind-of-a-Worm checks phase consistency on every PR that modifies a DD:
- DD header
> **Phase:**matches DD_PHASE_ROADMAP.md entry - Issue draft
Roadmap Phasetags are consistent with DD phase - Integration Map Phase Legend is current
Anti-pattern: A DD changes phase (e.g., from Phase 1 to Phase A) but only the DD file is updated — the roadmap, integration map, and issue drafts still show the old phase. This is exactly the DD020 bug discovered in Feb 2026: DD020 was Phase 0 in the roadmap but said Phase 1 in its own header.
When to Write a Design Document vs. Just Opening a PR¶
Write a DD if:
- The change affects how other contributors will work
- You are proposing a new modeling approach
- You are adding a major dataset or validation target
- You are changing an existing Design Document
Just open a PR if:
- Fixing a bug
- Improving documentation
- Adding tests
- Refactoring without changing behavior
- Making changes within an existing DD's scope
Alternatives Considered¶
1. Benevolent Dictator (Founder Decides Everything)¶
Rejected: Does not scale. Founder becomes bottleneck. Decisions are not transparent or documented.
2. Consensus Without Documentation (Slack Discussions Only)¶
Rejected: Decisions are lost to Slack history. Newcomers don't know what was decided or why. Constantly re-litigating settled questions.
3. Formal Voting on Every Decision¶
Rejected: Voting ends discussion and creative thinking (Fogel). Consensus-seeking is preferable. Voting is last resort.
4. No Process (Let Code Speak)¶
Rejected: "Code is the documentation" fails for architectural decisions. Why a particular approach was chosen over alternatives is not visible in the code.
Quality Criteria¶
What Makes a Good Design Document?¶
-
Actionable: A contributor can implement the DD without needing additional clarification.
-
Justification of Alternatives: Explains why rejected approaches were rejected, preventing re-proposals.
-
Clear Scope: Boundaries section makes explicit what the DD does NOT cover.
-
Testable: Quality criteria are measurable (acceptance thresholds, validation procedures).
-
Concise: Aim for 1,000-2,000 words. If longer, split into multiple DDs.
-
Living Document: Can be amended. If a DD proves wrong or incomplete, propose a new DD that supersedes it.
-
Validation-First: Goal & Success Criteria section must reference a specific DD010 tier and quantitative threshold. The reader should know what "done" looks like before reading the technical approach.
-
Concrete Deliverables: Must list exact output files with paths, not just describe them in prose. A contributor should know precisely what artifacts they are building.
-
Runnable Commands: Build & Test section must contain commands that a contributor can copy-paste. Scripts referenced must either exist or be marked
[TO BE CREATED]with a GitHub issue link. -
Complete Setup Path: The "Getting Started" sub-section must take a newcomer from a blank machine to a working environment. This means: repository clone URLs, dependency installation commands, and a clear Docker-vs-native fork. A contributor should never have to guess which repo to clone or which packages to install. If the DD shares a repo with another DD, cross-reference that DD's setup rather than duplicating instructions.
-
Visualizable: Must describe what the work looks like in the DD014 viewer. If not applicable (governance DDs), state "N/A."
-
Phase Consistency: The DD's
> **Phase:**header must match its entry inDD_PHASE_ROADMAP.md. If a DD appears in multiple phases (e.g., DD014 spans Phase 1-4), the header should reference the earliest phase and note the span.
Bad Design Document Anti-Patterns¶
- Vague: "Use good ion channel models." → What defines "good"?
- No alternatives: Only describes the chosen approach, doesn't explain why others were rejected.
- Untestable: No validation criteria, no way to know if implementation is correct.
- Scope creep: Tries to cover too much. Split into focused DDs.
- Obsolete: DD written years ago, no longer reflects current practice. Mark as "Superseded."
- Buried punchline: Validation goal appears at Step 6 instead of being the starting point. Lead with WHY, not HOW.
- Phantom scripts: Commands reference scripts that don't exist and have no issue tracking their creation.
- Disconnected from viewer: No description of how work appears in the visualization layer. Contributors can't see what they're building.
- No repo guidance: Contributor can't determine which repo to clone, where to file issues, or what to name their branch.
- Missing setup context: Build commands start with
cd some_repo/but never say how to get that repo. No clone URLs, no pip install commands, no Docker-vs-native guidance. A newcomer hits Step 1 and immediately gets stuck.
Mind-of-a-Worm Enforcement¶
Mind-of-a-Worm uses Design Documents as automated review criteria:
When a PR is opened:
- Mind-of-a-Worm identifies which subsystem (based on files modified)
- Retrieves relevant Design Documents (e.g., modifying
c302/triggers DD001, DD005) - Checks subsystem compliance:
- Are changes within the DD's scope?
- Do quality criteria pass? (e.g., NeuroML validation, test coverage)
- Are alternatives-considered principles violated? (e.g., re-proposing integrate-and-fire for all neurons when DD001 explicitly rejected this)
- Checks integration compliance (Integration Contract section):
- Does the PR change any output variable listed in the DD's Integration Contract?
- If yes: Identify all consuming DDs from the Coupling Dependencies table and tag their maintainers
- Does the PR add configurable parameters? If yes: verify
openworm.ymlschema is updated - Has the contributor run the integration test (
docker compose run quick-test)?
- Posts automated review comment:
- ✅ "Passes DD001 quality criteria (NeuroML validates, units correct)"
- ⚠️ "Warning: Modifies core HH parameters; confirm alignment with DD001 Section 2.3"
- ⚠️ "Integration alert: This PR modifies calcium output format (DD001 Integration Contract). DD002 (Muscle) and DD003 (Body Physics) consume this output. @muscle-maintainer @body-physics-maintainer please verify integration."
- ❌ "Violates DD001: Uses IAF model for all neurons (rejected in DD001 Alternatives)"
- ❌ "Missing integration test: No evidence of
docker compose run quick-testin PR description"
Human reviewer (L3+) considers Mind-of-a-Worm's assessment but makes final decision. For PRs that modify coupling interfaces, at least one reviewer from each affected consuming subsystem must approve.
Migration Path¶
Bootstrapping the DD System¶
Current state: Zero Design Documents exist (except those created in this proposal).
Phase 1 (Week 1-4): Founder writes initial DDs for existing subsystems:
- DD001-DD003: Neural, Muscle, Physics (document current architecture)
- DD005-DD010: Future work (document proposed phases)
- DD011-DD012: Governance
Phase 2 (Month 2-3): Community reviews. Open each DD as a PR, invite discussion, revise.
Phase 3 (Month 4+): DDs are accepted, become binding. New proposals follow RFC process.
Examples of When a DD Is Needed¶
Example 1: Switching from NEURON to Brian2 Simulator¶
Trigger: Contributor proposes replacing NEURON with Brian2 for faster simulation.
Action:
- Write DD013: "Simulator Backend Selection"
- Include: Context (why switch?), Decision (Brian2 vs. NEURON), Alternatives (NEST, custom solver), Quality Criteria (must reproduce all existing validation), Migration Path (parallel implementation during transition)
- Open RFC PR
- Community discusses performance benchmarks, NeuroML compatibility, learning curve
- L4 Neural Circuit maintainer decides
Outcome: Either approved (begin migration) or rejected (stay with NEURON, document why).
Example 2: Adding Sensory Transduction Models¶
Trigger: Contributor wants to model mechanosensation in touch neurons (ALM, AVM, PLM).
Action:
- Write DD014: "Mechanosensory Transduction (MEC-4 Channel Model)"
- Include: MEC-4/MEC-10 DEG/ENaC channel kinetics, Goodman et al. 1998 data, coupling to Sibernetic mechanical strain
- Open RFC PR
- Discuss with L4 Neural Circuit maintainer
- Approve
Outcome: DD014 becomes the specification. Contributor implements according to DD014. Mind-of-a-Worm checks compliance.
References¶
- Rust RFC Process: rust-lang.github.io/rfcs/
- Python PEPs: peps.python.org
- Architecture Decision Records: Google Cloud ADR guide, 18F blog
- Fogel, Producing Open Source Software (Chapter on written culture and design docs)
- Approved by: Pending (governance DD, requires community ratification)
- Implementation Status: Proposed
-
Next Actions:
- Set up design_documents/ directory in CElegansNeuroML and Sibernetic repos
- Document DD RFC process in CONTRIBUTING.md
- Train Mind-of-a-Worm on DD compliance checking