Interval annotations — phase labels, operator narration, task-segmentation events. Each entry has a start (ts), end (te), and a text label.
Chunk format
- Format:
jsonl
- Decoder:
jsonlDecoder
JSONL shape
{
ts: number // interval start (seconds)
te: number // interval end (seconds)
label: string // display text
kind?: string // free tag ('milestone', 'attempt', 'halted', ...)
color?: 'blue' | 'green' | 'orange' | 'purple' | 'gray-light' | 'gray-medium'
createTime?: number // queued-at time (renders a dashed wait-line preceding the execution bar)
[extra]: unknown // anything else the consumer may use
}
Sample data
{"ts": 0.0, "te": 2.5, "label": "reach", "operator": "alice", "target": "cube_A"}
{"ts": 2.5, "te": 4.0, "label": "approach","operator": "alice"}
{"ts": 4.0, "te": 5.5, "label": "grasp", "operator": "alice", "object": "cube_A"}
{"ts": 5.5, "te": 8.0, "label": "lift", "color": "orange"}
Compatible timeline lanes
| Lane | Notes |
|---|
PillLane | Default. Pill bars with start-dot + centered duration label. kind: 'halted' → dashed segment; kind: 'attempt' → diagonal stripes; createTime → wait-line before the bar. |
Compatible standalone views
Default props
| Field | Value |
|---|
textField | 'label' |
Python generator
from dreamlake import Episode
ep = Episode.create("ep1")
phases = ep.track("narration/phases", dtype="action_label")
phases.append({"ts": 0.0, "te": 2.5, "label": "reach", "target": "cube_A"})
phases.append({"ts": 2.5, "te": 4.0, "label": "approach"})
phases.append({"ts": 4.0, "te": 5.5, "label": "grasp", "color": "green"})
phases.append({"ts": 5.5, "te": 8.0, "label": "lift"})
registerDtype override
registerDtype({
id: 'action_label',
name: 'Action label',
defaults: { textField: 'name' }, // if your JSONL uses `name` instead of `label`
})