SCHEMAXIS · Declared work. Results you can check.Documentation ↗ · Contact
schemaxis/Agent’s Hands

Documentation / shotcut.md
Core 11629ae · View or edit Markdown on GitHub ↗

Shotcut timeline editing

schemaxis.shotcut/1 declares one editTimeline node with named assets, an ordered clips list, integer fps, pixel width/height and threads. Each clip selects startFrame (zero-based) and frameCount consecutive source frames. The planner derives contiguous timeline coverage and duration; duplicate ranges repeat source frames. It rejects missing/duplicate/unused asset identities, relative source paths and oversized timelines before native execution.

Use the Shotcut portable melt wrapper as the application executable. Its matching ffmpeg and ffprobe must be beside it. The wrapper supplies its own MLT libraries without changing your PATH. This is Shotcut's documented MLT project/rendering interface, not a general native-command or authored XML passthrough.

Sources must contain exactly one silent video stream, progressive square pixels, zero-based constant timestamps, matching integer fps and matching dimensions. Rotation, audio, subtitle streams, resizing and frame-rate conversion are rejected. Every decoded frame must explicitly report interlaced_frame=0; unknown stream field order alone does not establish progressive frames. Absent/unknown sample aspect metadata is interpreted as square pixels; explicit non-square ratios fail. Sources are copied before execution; the editable project references captured asset-XX.media companions using relative names. Retain those files beside project.mlt when opening or relocating the project. The project alone is not a self-contained handoff. The video publication is independently usable.

The run emits stable artifacts: index 0 video.mkv (video), index 1 project.mlt (videoProject), index 2 project-bundle.zip (videoProjectBundle). The bundle contains only the native project and all captured media; exact member names, order, bytes, regular-file layout and bounded size are checked. Extract these members together for a self-contained editable handoff. General external ZIP import is unsupported. The project uses Shotcut track metadata and standard MLT profile, producers and playlist entries. A native MLT XML consumer reloads and serialises its service graph. The adaptor checks profile, source identities and every range, then renders both the original and native-reloaded project in fresh processes. Their complete decoded RGB must match exactly. Every output frame also matches its independently selected source pixels at fixed per-frame mean error <=3/255 and maximum channel error <=8/255, allowing bounded MLT colour conversion. FFV1 preserves the rendered RGB; this check does not certify perceptual quality or colour management. GUI editing, native edit reverse synchronisation, audio, transitions, filters and multiple tracks are outside this qualification.

The maximum is 16 assets, 128 clips and 600 timeline frames, with 192 MiB budgets for captured source bytes, decoded source RGB and timeline RGB. All native stages share one elapsed timeout and the framework's cancellation/process ownership. A failed run retains logs and an unsuccessful result. Verification rechecks captured inputs, native ranges, both decodes, probes, artifacts, commands and logs. Each native stage hashes its consumed inputs in a deterministic trusted launcher immediately before replacing itself with the application process. Final probe and decode input hashes must match the current video bytes, so refreshing an artifact manifest hash cannot attach old decoded pixels to a changed video. This is ordinary evidence integrity; wholesale fabrication of all native evidence is outside this local trust model. A regular-file check precedes source capture and nonblocking descriptor validation rejects FIFOs without hanging. The adaptor never accepts a process exit or file existence as sufficient proof.

examples/schemaxis/shotcut-timeline.json is editable and plan-only until its absolute placeholder is bound. The six-frame fixture contains red, green, blue, yellow, cyan and magenta at 32x24 and 25 fps. Baseline cuts [3,6) then [0,2) produce yellow/cyan/magenta/red/green (five frames, 0.2 s). The variant repeats [1,3) twice, producing green/blue/green/blue (four frames, 0.16 s). A third 400x200 fixture repeats the baseline to qualify ordinary image dimensions. Independent acceptance checks these literal RGB colours, counts and durations; it also checks changed artifacts, source ranges and rendering after relocating only the project and its captured media. The fixtures were generated as lossless FFV1 from literal RGB colours using public FFmpeg CLI; they contain no external media. Publication uses FFV1 version 1 without a forced slice layout. Full decode and hash verification establish integrity; no FFV1 version 3 slice-CRC claim is made.

PYTHONPATH=src python3 tools/qualify_shotcut.py --executable /absolute/Shotcut.app/melt \
  --output-directory evidence/shotcut-acceptance
PYTHONPATH=src python3 -m schemaxis readiness --app shotcut --admission --check

Public upstream references: MLT XML, Melt CLI, Shotcut download and Shotcut source. MLT's MLT_XML_DEEP environment setting requests native service graph serialisation during the reload stage; it is defined by the public XML producer implementation.