12 KiB
Executable File
Experiment Designer Step Integration (Modular Architecture + Drift Handling)
Overview
The HRIStudio experiment designer has been redesigned with a step-based + provenance-aware architecture that provides intuitive experiment creation, transparent plugin usage, and reproducible execution through integrity hashing and a compiled execution graph.
Architecture
Core Design Philosophy
The designer follows a clear hierarchy that matches database structure, runtime execution, and reproducibility tracking:
- Experiment → Steps → Actions (with provenance + execution descriptors)
- Steps are primary containers in the flow (Step 1 → Step 2 → Step 3) with sortable ordering
- Actions are dragged from a categorized library into step containers (core vs plugin clearly labeled)
- Direct 1:1 mapping to database
stepsandactionstables, persisting provenance & transport metadata
Key Components (Post-Modularization)
ActionRegistry (ActionRegistry.ts)
- Loads actions from core plugin repositories (
hristudio-core/plugins/) - Integrates study-scoped robot plugins (namespaced:
pluginId.actionId) - Provides fallback actions if plugin loading fails (ensures minimal operability)
- Maps plugin parameter schemas (primitive: text/number/select/boolean) to UI fields
- Retains provenance + execution descriptors (transport, timeout, retryable)
Step-Based Flow (StepFlow.tsx)
- Sortable step containers with drag-and-drop reordering (via
@dnd-kit) - Color-coded step types (sequential, parallel, conditional, loop) with left border accent
- Expandable/collapsible view for managing complex experiments
- Visual connectors between steps (light vertical separators)
- Isolated from parameter/editor logic for performance and clarity
Action Library (ActionLibrary.tsx)
- Categorized tabs: Wizard (blue), Robot (emerald), Control (amber), Observation (purple)
- Tooltips show description, parameters, provenance badge (C core / P plugin)
- Drag-and-drop from library directly into specific step droppable zones
- Footer statistics (total actions / category count)
- Empty + fallback guidance when plugin actions absent
- Guarantees availability: once the experiment's study context and its installed plugins are loaded, all corresponding plugin actions are registered and appear (guarded against duplicate loads / stale study mismatch)
- Plugin availability is study-scoped: only plugins installed for the experiment's parent study (via Plugin Store installation) are loaded and exposed; this ensures experiments cannot reference uninstalled or unauthorized plugin actions.
Properties Panel (PropertiesPanel.tsx)
- Context-aware: action selection → action parameters; step selection → step metadata; otherwise instructional state
- Boolean parameters now render as accessible Switch
- Number parameters with
min/maxrender as Slider (shows live value + bounds) - Number parameters without bounds fall back to numeric input
- Select/text unchanged; future: enum grouping + advanced editors
- Displays provenance + transport badges (plugin id@version, transport, retryable)
User Experience
Visual Design
- Tightened Spacing: Compact UI with efficient screen real estate usage
- Dark Mode Support: Proper selection states and theme-aware colors
- Color Consistency: Category colors used throughout for visual coherence
- Micro-interactions: Hover states, drag overlays, smooth transitions
Interaction Patterns
- Direct Action Editing: Click any action to immediately edit properties (no step selection required)
- Multi-level Sorting: Reorder steps in flow, reorder actions within steps
- Visual Feedback: Drop zones highlight, selection states clear, drag handles intuitive
- Touch-friendly: Proper activation constraints for mobile/touch devices
Properties Panel (Enhanced Parameter Controls)
- Action-First Workflow: Immediate property editing on action selection
- Rich Metadata: Icon, category color, provenance badges (Core/Plugin, transport)
- Switch for Boolean: Improves clarity vs checkbox in dense layouts
- Slider for Ranged Number: Applies when
minormaxpresent (live formatted value) - Graceful Fallbacks: Plain number input if no bounds; text/select unchanged
- Context-Aware: Step editing (name/type/trigger) isolated from action editing
Technical Implementation
Drag and Drop System
Built with @dnd-kit for robust, accessible drag-and-drop:
// Multi-context sorting support
const handleDragEnd = (event: DragEndEvent) => {
// Action from library to step
if (activeId.startsWith("action-") && overId.startsWith("step-")) {
// Add action to step
}
// Step reordering in flow
if (!activeId.startsWith("action-") && !overId.startsWith("step-")) {
// Reorder steps
}
// Action reordering within step
if (!activeId.startsWith("action-") && !overId.startsWith("step-")) {
// Reorder actions in step
}
};
Plugin Integration (Registry-Centric)
Actions are loaded dynamically from multiple sources with provenance & version retention:
class ActionRegistry {
async loadCoreActions() {
// Load from hristudio-core/plugins/
const coreActionSets = ["wizard-actions", "control-flow", "observation"];
// Process and register actions
}
loadPluginActions(studyId: string, studyPlugins: Array<{plugin: any}>) {
// Load robot-specific actions from study plugins
// Map parameter schemas to form controls
}
}
Database & Execution Conversion
Two-layer conversion:
- Visual design → DB steps/actions with provenance & execution metadata
- Visual design → Compiled execution graph (normalized actions + transport summary + integrity hash)
function convertStepsToDatabase(steps: ExperimentStep[]): ConvertedStep[] {
return steps.map((step, index) => ({
name: step.name,
type: mapStepTypeToDatabase(step.type),
orderIndex: index,
conditions: step.trigger.conditions,
actions: step.actions.map((action, actionIndex) => ({
name: action.name,
type: action.type,
orderIndex: actionIndex,
parameters: action.parameters,
})),
}));
}
Validation & Hash Drift Handling
A validation workflow now surfaces structural integrity + reproducibility signals:
Validation Endpoint
experiments.validateDesignreturns:valid+issues[]integrityHash(deterministic structural hash from compiled execution graph)pluginDependencies(sorted, namespaced with versions)- Execution summary (steps/actions/transport mix)
Drift Detection (Client-Side)
- Local state caches:
lastValidatedHash+ serialized design snapshot - Drift conditions:
- Stored experiment
integrityHash≠ last validated hash - Design snapshot changed since last validation (structural or param changes)
- Stored experiment
- Badge States:
Validated(green outline): design unchanged since last validation and matches stored hashDrift(destructive): mismatch or post-validation editsUnvalidated: no validation performed yet
Rationale
- Encourages explicit revalidation after structural edits
- Prevents silent divergence from compiled execution artifact
- Future: differentiate structural vs param-only drift (hash currently parameter-key-based)
Planned Enhancements
- Hash stability tuning (exclude mutable free-text values if needed)
- Inline warnings on mutated steps/actions
- Optional auto-validate on save (configurable)
Plugin System Integration
Core Actions
Loaded from hristudio-core/plugins/ repositories:
- wizard-actions.json: Wizard speech, gestures, instructions
- control-flow.json: Wait, conditional logic, loops
- observation.json: Behavioral coding, data collection, measurements
Robot Actions
Dynamically loaded based on study configuration:
- Robot-specific actions from plugin repositories
- Parameter schemas automatically converted to form controls
- Platform-specific validation and constraints
Fallback System
Essential actions available even if plugin loading fails:
- Basic wizard speech and gesture actions
- Core control flow (wait, conditional)
- Simple observation and data collection
Example Usage
Creating an Experiment
- Add Steps: Click "Add Step" to create containers in the experiment flow
- Configure Steps: Set name, type (sequential/parallel/conditional/loop), triggers
- Drag Actions: Drag from categorized library into step drop zones
- Edit Properties: Click actions to immediately edit parameters
- Reorder: Drag steps in flow, drag actions within steps
- Save: Direct conversion to database step/action records (provenance & execution metadata persisted)
Visual Workflow
Action Library Experiment Flow Properties
┌─────────────┐ ┌──────────────────┐ ┌─────────────┐
│ [Wizard] │ │ Step 1: Welcome │ │ Action: │
│ [Robot] │ -----> │ ├ Wizard Says │ ------> │ Wizard Says │
│ [Control] │ │ ├ Wait 2s │ │ Text: ... │
│ [Observe] │ │ └ Observe │ │ Tone: ... │
└─────────────┘ └──────────────────┘ └─────────────┘
Benefits
For Researchers
- Intuitive Design: Natural workflow matching experimental thinking
- Visual Clarity: Clear step-by-step experiment structure
- Plugin Integration: Access to full ecosystem of robot platforms
- Direct Editing: No complex nested selections required
For System Architecture
- Clean Separation: Visual design vs execution logic clearly separated
- Database Integrity: Direct 1:1 mapping maintains relationships
- Plugin Extensibility: Easy integration of new robot platforms
- Type Safety: Complete TypeScript integration throughout
For Development
- Maintainable Code: Clean component architecture with clear responsibilities
- Performance: Efficient rendering with proper React patterns
- Error Handling: Graceful degradation when plugins fail
- Accessibility: Built on accessible
@dnd-kitfoundation
Modular Architecture Summary
| Module | Responsibility | Notes |
|---|---|---|
BlockDesigner.tsx |
Orchestration (state, save, validation, drift badges) | Thin controller after refactor |
ActionRegistry.ts |
Core + plugin action loading, provenance, fallback | Stateless across renders (singleton) |
ActionLibrary.tsx |
Categorized draggable palette | Performance-isolated |
StepFlow.tsx |
Sortable steps & actions, structural UI | No parameter logic |
PropertiesPanel.tsx |
Parameter + metadata editing (enhanced controls) | Switch + Slider integration |
Future Enhancements
Planned Features (Updated Roadmap)
- Step Templates: Reusable step patterns for common workflows
- Visual Debugging: Inline structural + provenance validation markers
- Collaborative Editing: Real-time multi-user design sessions
- Advanced Conditionals: Branching logic & guard editors (visual condition builder)
- Structural Drift Granularity: Distinguish param-value vs structural changes
- Version Pin Diffing: Detect plugin version upgrades vs design-pinned versions
Integration Opportunities
- Version Control: Track experiment changes across iterations
- A/B Testing: Support for experimental variations within single design
- Analytics Integration: Step-level performance monitoring
- Export Formats: Convert to external workflow systems
This redesigned experiment designer now combines step-based structure, provenance tracking, transport-aware execution compilation, integrity hashing, and validation workflows to deliver reproducible, extensible, and transparent experimental protocols.