Repository navigation
Add resumable deterministic frame-sequence export (#3) - #12
Merged
Merged
Conversation
KreutzM
marked this pull request as ready for review
August 31, 2026 16:43
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds a production-quality, resumable frame-sequence export that renders an existing offline frame plan into a directory of deterministic PNG frames, plus a
fractal-render export-framesCLI command. No camera, cadence, tone-mapping or numerical semantics changed; the feature strictly reusesbuild_offline_frame_plan,render_offline_framesand the existing request/camera-path contracts.New module
frame_sequence_export.py:FrameSequenceSettings— validated image format (PNG),{index}filename pattern (bare filename, exactly one placeholder, matching extension), overwrite policy.parse_frame_range— inclusive-start/exclusive-stop range validation against the plan.export_frame_sequence— renders a range, verifies/skips existing completed frames (RGB mode + plan size) unlessoverwrite=True, re-validates each rendered frame (shape/dtype), publishes atomically (unique.partfile +os.replace, temporary cleanup on any failure), supports cooperative cancellation between frames withFrameSequenceResult.next_start_index()resume reporting, optional temporal tone planning (from index 0 only, matching the analysis contract), progress callbacks and surface lighting pass-through. The output directory is created only once the run reaches publication.SystemExitwith a clearexport-frames: …message; unexpected errors andKeyboardInterruptstill surface normally.Issue
Closes #3
Design / Decisions
frame_sequence_export.py) documented indocs/ARCHITECTURE.md; file publication is separated from frame production like the MP4 layer separates encoding.test_frames_match_render_offline_frames_output.Validation
Local (Linux WSL,
.venv, CPU backend):pytest -q: 368 passed (18 tests intests/test_frame_sequence_export.py, 2 new CLI tests intests/test_service_and_cli.py).scripts/check_pan_stability.py --backend cpu: STABLE.examples/flight_plans/twin-spiral-nocturne.fractal-flight.json(521-frame plan): chunk render, then resume with larger--stop→ "2 rendered, 3 skipped".GitHub CI on final head
2b0329a: all 8 checks pass — Tests ubuntu-latest 3.11/3.12/3.13, Tests windows-latest 3.11/3.12/3.13, GUI+stability+wheel, Source ZIP and Git bundle.Independent review loop (fresh reviewer subagents per
.hermes.md§14):--filename-patternparsed but not forwarded in the CLI) + 4 MINOR + 2 NIT → all fixed in7f7b1b8.OfflineFrameRenderError/Mp4ExportCancelled) + 1 NIT (duplicate separators) + empty-dir-on-error observation → all fixed in2b0329a.Not executed / pending: physical CUDA hardware tests (not required — renderer internals unchanged); Windows local GUI runs beyond CI (CI covers windows-latest headless tests).
Remaining / Follow-ups
_SUPPORTED_IMAGE_FORMATS).Handoff
Branch
agent/3-frame-sequence-export, head2b0329a, based on currentmain. Three-round independent review converged on ready; CI fully green. Awaiting explicit user merge authorization — not merged.