You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Today every Scene captured by #216 is a single-instant viewport snapshot (time_range = null per #215). For scenarios where the analytical story is "watch the contact converge over the next 10 minutes" or "show the search pattern unfold", authors have no way to record a time-windowed Scene — they must capture many adjacent single-instant Scenes and rely on the transport's flyTo + slider tween (#217) to suggest motion. The Out of Scope lists in specs/215-storyboarding-schema/spec.md, specs/217-storyboarding-playback/spec.md, and specs/218-storyboarding-edit/spec.md all explicitly defer this as a phase-2 follow-up.
Schema scaffolding is already present: SceneProperties.time_range exists in geojson.yaml and is currently always null. Closing this gap is the natural next step in storyboarding expressiveness.
Proposed Solution
Lift the v1 constraint and make time_range != null a first-class capture + playback mode.
New "Capture range…" affordance (UI shape TBD during /speckit.specify — likely a modifier on the existing Ctrl/Cmd+Alt+C shortcut, e.g. Ctrl/Cmd+Alt+Shift+C, with a small inline prompt to mark the end time by pressing again at the desired moment).
Scene's time_range = [t_start, t_end] is stored; viewport is captured at the start and at the end (two viewport snapshots inside the Scene).
Full v2 behaviour confirmed in interview: both pan/zoom interpolation AND time-slider scrub.
During executeTransition into a time-range Scene, the playback engine:
Linearly interpolates the viewport from viewport_start → viewport_end over the captured wall-clock duration (or a transport-configurable playback rate).
Simultaneously advances the time-slider from t_start → t_end so feature visibility / track positions / chart cursors all move in lock-step.
Reverse playback (existing transport Backward button) reverses both axes.
Schema:
SceneProperties.time_range already exists; add viewport_end: Viewport | null (or model both endpoints as a list).
Generate Pydantic / TS / JSON Schema.
Article II adherence tests + new golden fixtures for time-range Scenes.
CRUD (shared/components/src/storyboard/):
createScene accepts an optional timeRange + viewportEnd.
Validation rejects time_range ranges that fall outside the plot's time bounds, or where t_end <= t_start.
Success Criteria
An author can record a Scene that plays back as a continuous viewport tween + time-slider sweep over an analyst-chosen window.
A Storyboard mixing single-instant and time-range Scenes plays back correctly with each Scene honoured per its time_range shape.
Schema round-trip (Python ↔ TS ↔ JSON) passes for time-range Scenes; golden fixtures cover both Scene flavours.
Existing single-instant Scenes continue to behave exactly as before (no playback regression).
Backward playback reverses both viewport interpolation and time-slider sweep cleanly.
Constraints
LinkML-first per Article II — schema change is the authoritative source.
Article XIV (pre-release freedom) authorises any necessary schema break; pre-existing single-instant Scenes must still deserialise (time_range = null path).
Problem
Today every Scene captured by #216 is a single-instant viewport snapshot (
time_range = nullper #215). For scenarios where the analytical story is "watch the contact converge over the next 10 minutes" or "show the search pattern unfold", authors have no way to record a time-windowed Scene — they must capture many adjacent single-instant Scenes and rely on the transport'sflyTo+ slider tween (#217) to suggest motion. The Out of Scope lists inspecs/215-storyboarding-schema/spec.md,specs/217-storyboarding-playback/spec.md, andspecs/218-storyboarding-edit/spec.mdall explicitly defer this as a phase-2 follow-up.Schema scaffolding is already present:
SceneProperties.time_rangeexists ingeojson.yamland is currently alwaysnull. Closing this gap is the natural next step in storyboarding expressiveness.Proposed Solution
Lift the v1 constraint and make
time_range != nulla first-class capture + playback mode.Capture (extends #216):
Ctrl/Cmd+Alt+Cshortcut, e.g.Ctrl/Cmd+Alt+Shift+C, with a small inline prompt to mark the end time by pressing again at the desired moment).time_range = [t_start, t_end]is stored; viewport is captured at the start and at the end (two viewport snapshots inside the Scene).Playback (extends #217):
executeTransitioninto a time-range Scene, the playback engine:viewport_start→viewport_endover the captured wall-clock duration (or a transport-configurable playback rate).t_start→t_endso feature visibility / track positions / chart cursors all move in lock-step.Schema:
SceneProperties.time_rangealready exists; addviewport_end: Viewport | null(or model both endpoints as a list).CRUD (
shared/components/src/storyboard/):createSceneaccepts an optionaltimeRange+viewportEnd.time_rangeranges that fall outside the plot's time bounds, or wheret_end <= t_start.Success Criteria
time_rangeshape.Constraints
time_range = nullpath).Out of Scope
delete + re-capturein MVP.Dependencies
Originally captured under epic item #229 in BACKLOG.md; promoted via
/interview 229(2026-05-19) — epic was split into three independent items.