---
id: TASK-40
title: Port workflow engine (propagators + execution)
status: Done
assignee: []
created_date: '2026-02-18 19:51'
updated_date: '2026-03-12 04:38'
labels:
  - infrastructure
  - phase-6
  - workflow
milestone: m-0
dependencies:
  - TASK-24
references:
  - canvas-website/src/lib/workflow/
  - canvas-website/src/propagators/WorkflowPropagator.ts
  - canvas-website/src/propagators/ScopedPropagators.ts
  - rspace-online/lib/folk-workflow-block.ts
priority: medium
---

## Description

<!-- SECTION:DESCRIPTION:BEGIN -->
Port the workflow execution engine from canvas-website to rspace-online. This powers the existing folk-workflow-block shape with actual data flow and execution.

Source files (3,676 lines total):
- canvas-website/src/lib/workflow/types.ts (159 lines) — type definitions
- canvas-website/src/lib/workflow/blockRegistry.ts (438 lines) — block definition registry
- canvas-website/src/lib/workflow/executor.ts (548 lines) — block execution engine
- canvas-website/src/lib/workflow/portBindings.ts (464 lines) — port connection logic
- canvas-website/src/lib/workflow/validation.ts (417 lines) — graph validation
- canvas-website/src/lib/workflow/serialization.ts (571 lines) — save/load workflows
- canvas-website/src/propagators/WorkflowPropagator.ts (326 lines) — real-time data flow

Target: rspace-online/lib/workflow/ directory

Key adaptation needed: canvas-website uses tldraw store for state; rspace-online uses Automerge. The execution engine needs to read/write shape data through CommunitySync instead of tldraw's store.

Also port relevant propagator concepts:
- canvas-website/src/propagators/ScopedPropagators.ts (314 lines)
- canvas-website/src/propagators/SpatialIndex.ts (164 lines)
<!-- SECTION:DESCRIPTION:END -->

## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 Block registry loads available block types
- [ ] #2 Port connections transfer data between blocks
- [ ] #3 Execution engine runs blocks in correct order
- [ ] #4 Validation catches invalid graph configurations
- [ ] #5 Workflows serialize/deserialize through Automerge
- [ ] #6 Real-time propagation updates connected blocks
<!-- AC:END -->

## Implementation Notes

<!-- SECTION:NOTES:BEGIN -->
Implemented 3 stub actions: action-create-task (creates TaskItem in rTasks board via SyncServer), action-send-notification (logs + returns notification data), action-update-data (applies JSON template to target module doc). Added WorkflowLogEntry type + workflowLog field to ScheduleDoc. Added appendWorkflowLog() with 100-entry cap, called from manual run, cron tick, and webhook trigger. Added retry logic (max 2 retries, exponential backoff 1s/2s) to executeWorkflow node execution. Added GET /api/workflows/log endpoint.
<!-- SECTION:NOTES:END -->
