The zoom lane — ED.12
The rostrum operator never improvised a push-in. Every camera move was planned on an exposure sheet — ruled paper where each row was a frame and a margin column noted the moves: zoom in, frames 120–180; hold; zoom out. The move list was authored on paper, then executed by the stand. ED.12 is that exposure sheet as a timeline lane: each block is one planned push-in, and the zoom engine is the stand that executes it at preview and export.
flowchart LR ADD["+ Zoom at the playhead"] --> OP["EditOp::AddZoom"] OP --> H["edit::History.apply"] H --> ZL["project.zooms"] ZL --> LANE["ZoomLane blocks\n(laid out by fraction)"] LANE -->|select / ×| H ZL --> ENG["ED.16 engine compiles\neach to a push-in at render"]
The lane authors ZoomSegment values; it never renders pixels. A block is
laid out by zoom_spans with
the same fraction-of-duration math as the filmstrip,
so the zoom lane lines up frame-for-frame with the video and audio tracks
above and below it. + Zoom drops a default ~1.5 s, 1.6× region at the
playhead through EditOp::AddZoom; clicking a block selects it; its ×
removes it — all via the proptest-verified History, so every add and
remove is undoable from the trim bin.