Sink
Terminate a workflow branch without action
The Sink node terminates a workflow branch without taking any action. It's a "no-op" node that cleanly ends paths where no further processing is needed.
Overview
| Property | Value |
|---|---|
| Category | Control |
| Node ID | ds.sink.perItem.in1.success0.error0 |
| Input Ports | 1 |
| Success Outputs | 0 |
| Error Outputs | 0 |
| Execution Mode | Per-item |
Configuration
The Sink node has no configuration parameters. It simply terminates the branch.
How It Works
[Process] ──▶ [Sink]
│
✓ Branch ends cleanly
The Sink node:
- Receives input data
- Does nothing with it
- Has no outputs
- Branch execution is complete
Input Schema
Accepts any data from upstream. Data is consumed but not processed.
Output Schema
None—Sink has no outputs.
Examples
Basic Example: Handle False Branch
Terminate an If node's false path:
Workflow:
[If: needs_action?]
├── True ──▶ [Send Alert]
└── False ─▶ [Sink]
Without Sink, the false branch would be disconnected, which is not recommended.
Example: Error Path Termination
End error paths that don't need handling:
Workflow:
[Load Meeting]
├── Success ──▶ [Process Data]
└── Error ────▶ [Log Error] ──▶ [Sink]
The error is logged, then the branch ends.
Example: Filter Out Unwanted Items
Process only matching items, discard others:
Workflow:
[Select Many: items]
│
▼
[If: meets_criteria?]
├── True ──▶ [Process Item]
└── False ─▶ [Sink]
Items that don't meet criteria are simply discarded.
Example: Multi-Condition Filtering
Multiple levels of filtering:
Workflow:
[If: is_valid?]
├── True ──▶ [If: is_important?]
│ ├── True ──▶ [Alert]
│ └── False ─▶ [Sink] ← Not important enough
│
└── False ─▶ [Sink] ← Invalid, discard
Example: Handle No-Transcript Case
When transcript isn't available:
Workflow:
[Load Meeting]
│
▼
[If: has_transcript?]
├── True ──▶ [AI: Analyze] ──▶ [Send Summary]
│
└── False ─▶ [Slack: "No transcript"] ──▶ [Sink]
Notify, then end without further processing.
Example: Duplicate Detection
Skip already-processed items:
Workflow:
[Load Item]
│
▼
[If: already_processed?]
├── True ──▶ [Sink] ← Skip duplicate
│
└── False ─▶ [Process] ──▶ [Mark Processed]
Best Practices
1. Always Terminate Conditional Branches
Every If output should connect somewhere:
✅ Good:
[If]
├── True ──▶ [Action]
└── False ─▶ [Sink]
❌ Bad:
[If]
├── True ──▶ [Action]
└── False ─▶ (disconnected)
2. Use After Logging Errors
After logging an error, end cleanly:
[Error Path] ──▶ [Log Error] ──▶ [Sink]
Rather than leaving the log node's output unconnected.
3. Name Your Branches
Consider why each Sink exists:
// Filter: Not meeting our criteria
[If: criteria?]
└── False ─▶ [Sink]
// Error: Failed to load data
[Load]
└── Error ─▶ [Log] ──▶ [Sink]
4. Don't Over-Use
Sink is for intentional termination:
- ✅ Filtering unwanted items
- ✅ Graceful error handling
- ❌ Hiding problems (should address root cause)
Common Issues
Workflow seems incomplete
Symptom: Data enters Sink but expected processing doesn't happen
Cause: Logic error routing to Sink instead of processing
Solution:
- Check If node conditions
- Verify data meets criteria
- Trace execution path in logs
"Why does my workflow do nothing?"
Symptom: Workflow completes but no actions taken
Cause: All paths leading to Sink
Solution:
- Review If conditions—are they too restrictive?
- Check if data matches expected format
- Test with known-good data
Disconnected branches warning
Symptom: Visual warning about disconnected outputs
Cause: Output port not connected
Solution: Connect to Sink to explicitly terminate
Related Nodes
- If - Creates branches that may need Sink
- Any action node - For branches that should take action instead
Technical Details
Execution
Sink executes normally:
- Receives input
- Marks execution of this branch as complete
- No further processing
Execution Status
Workflows with Sink-terminated branches:
- Can still complete successfully
- Sink doesn't indicate failure
- Just means "nothing more to do here"
Memory
Data sent to Sink is released:
- Not stored beyond execution logs
- No downstream processing
- Clean termination
Why Not Just Disconnect?
Using Sink instead of disconnected outputs:
- Explicit intent: Shows termination is intentional
- Clean graphs: No visual clutter from dangling connections
- Execution clarity: Logs show clean branch completion
- Best practice: Avoids ambiguity about whether disconnect was intentional
Comparison
| Scenario | Use Sink | Don't Use Sink |
|---|---|---|
| Don't want to take action | ✅ | |
| Filter out items | ✅ | |
| Error handling (after logging) | ✅ | |
| Want to take action | ✅ Use action node | |
| Need data downstream | ✅ Use appropriate node | |
| Branch should continue | ✅ Don't terminate |