# Symmetry: chapter and animation review packet

Review the complete Symmetry section, including its prose, equations, static figures, and animations, using the supplied source and sampled movie frames. This packet supplies evidence and context; it contains no review findings or grades.

The intended reader is an interested non-specialist with undergraduate mathematics. Assess how the explanation builds from its stated starting points; identify additional prerequisites when they occur.

These are sparse samples decoded from the current MP4, not newly rendered illustrations. They can support checks of the sampled states and labels, but cannot establish continuous motion, timing, transitions, or the absence of problems between samples. Use the full MP4 when judging those properties.

Source SHA-256 values identify the exact downloadable bytes in this packet. The source mapping and recorded checks explain the likely generation pipeline; they do not prove that these exact source bytes produced the movie. A GitHub link pinned to a commit is provided only when the delivered source bytes exactly match that path at the build's Git HEAD.

The ZIP contains frames, contact sheets, manifests, source text, all chapter images, and chapter/context markdown. MP4s are excluded. [Read the complete chapter and play its movies online](https://wadelamble.github.io/constrained-improvisation/symmetry/).

[Read the chapter with portable media links](chapter-portable.md) · [Verbatim chapter markdown](chapter.md) · [Media map](chapter-media.md) · [Machine-readable index](index.json) · [Source mapping](animation-sources.json)

chapter.md retains the repository's original relative media references. chapter-portable.md preserves its prose and equations and adjusts only media link targets to included images and absolute public MP4 URLs.

Consider physical and mathematical correctness; whether the argument supports its claims and makes imported assumptions explicit; teaching clarity; and whether the figures and animations faithfully show the stated mathematics. Assess the whole section's sequence as well as individual visuals.

For each observation, identify the animation and timestamp or source lines, describe the issue and its effect on the chapter's claim, and distinguish direct observation from inference. Leave unexamined properties unassessed.

## 1. symmetry-pool-table.mp4

Chapter section: Symmetry

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-pool-table) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-pool-table.mp4)

Caption (verbatim): Symmetry transforms don't change how pool balls behave

[Verbatim surrounding context](symmetry-pool-table/context.md) · [Frame manifest](symmetry-pool-table/manifest.json)

Video: `content/drafts/animations/symmetry-pool-table.mp4`; SHA-256 `60ac9f04ccefa11525471e6dc5bcced6497776b8f51b767f1c00ffbddfbbb4a6`.

1600 × 960; 30 fps; 14 s; 420 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Main script --render draws the equal-mass elastic-disk trials and encodes frames directly with FFmpeg. --check and --encoded-check produce the companion numerical and decoded-video reports. It has no local Python imports or input movie.

Mapping evidence and limits: The script's NAME and output match the linked movie. Matching validation and encoded-validation JSON record 1600 x 960, 30 fps, 420 frames, 14 s. The reports contain no movie hash, so this is source/output-name attribution rather than a hash-attested build.

[Decoded contact sheet](symmetry-pool-table/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_pool_table.py](sources/scripts/generate_symmetry_pool_table.py.txt): SHA-256 `b16887b92be1a8b23c5932ce457c6c1f7db0ca90519d0b963b0a377448a37c7f`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_pool_table.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-pool-table-validation.json](symmetry-pool-table/checks/symmetry-pool-table-validation.json): SHA-256 `0563fa0c6d81a153869ef1d1fec1518d4fcdf84e15cafa840428443ffaccde0c`

- [symmetry-pool-table-encoded-validation.json](symmetry-pool-table/checks/symmetry-pool-table-encoded-validation.json): SHA-256 `dc55bdc42a1d12e38e8008a0a667e2a668175b2a06e7e871cb026166f1712a6e`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-pool-table/frames/frame-01.jpg)

- [00:01.267, frame 38](symmetry-pool-table/frames/frame-02.jpg)

- [00:02.533, frame 76](symmetry-pool-table/frames/frame-03.jpg)

- [00:03.800, frame 114](symmetry-pool-table/frames/frame-04.jpg)

- [00:05.067, frame 152](symmetry-pool-table/frames/frame-05.jpg)

- [00:06.333, frame 190](symmetry-pool-table/frames/frame-06.jpg)

- [00:07.633, frame 229](symmetry-pool-table/frames/frame-07.jpg)

- [00:08.900, frame 267](symmetry-pool-table/frames/frame-08.jpg)

- [00:10.167, frame 305](symmetry-pool-table/frames/frame-09.jpg)

- [00:11.433, frame 343](symmetry-pool-table/frames/frame-10.jpg)

- [00:12.700, frame 381](symmetry-pool-table/frames/frame-11.jpg)

- [00:13.967, frame 419](symmetry-pool-table/frames/frame-12.jpg)

## 2. symmetry-triangle-actions.mp4

Chapter section: Discrete symmetries

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-triangle-actions) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-triangle-actions.mp4)

Caption (verbatim): A triangle's symmetries

[Verbatim surrounding context](symmetry-triangle-actions/context.md) · [Frame manifest](symmetry-triangle-actions/manifest.json)

Video: `content/drafts/animations/symmetry-triangle-actions.mp4`; SHA-256 `d03afb8e8f4d486b40907a7d551496836714e27650b67037f92d42f2a7ee44a9`.

900 × 620; 18 fps; 20 s; 360 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. It draws the triangle-action frames with Pillow and encodes them with FFmpeg, then writes a poster. It has no local Python imports or input movie.

Mapping evidence and limits: main() explicitly writes symmetry-triangle-actions.mp4; constants specify 900 x 620 at 18 fps. No matching validation JSON is present. Attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-triangle-actions/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_triangle_actions_animation.py](sources/scripts/generate_symmetry_triangle_actions_animation.py.txt): SHA-256 `233476265d3bbde8b9736f509059e0346cc778c45152c69fde68880ab1bb89c5`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_triangle_actions_animation.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-triangle-actions/frames/frame-01.jpg)

- [00:01.833, frame 33](symmetry-triangle-actions/frames/frame-02.jpg)

- [00:03.611, frame 65](symmetry-triangle-actions/frames/frame-03.jpg)

- [00:05.444, frame 98](symmetry-triangle-actions/frames/frame-04.jpg)

- [00:07.278, frame 131](symmetry-triangle-actions/frames/frame-05.jpg)

- [00:09.056, frame 163](symmetry-triangle-actions/frames/frame-06.jpg)

- [00:10.889, frame 196](symmetry-triangle-actions/frames/frame-07.jpg)

- [00:12.667, frame 228](symmetry-triangle-actions/frames/frame-08.jpg)

- [00:14.500, frame 261](symmetry-triangle-actions/frames/frame-09.jpg)

- [00:16.333, frame 294](symmetry-triangle-actions/frames/frame-10.jpg)

- [00:18.111, frame 326](symmetry-triangle-actions/frames/frame-11.jpg)

- [00:19.944, frame 359](symmetry-triangle-actions/frames/frame-12.jpg)

## 3. symmetry-d3-rotations-vs-flips.mp4

Chapter section: Representations

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-d3-rotations-vs-flips) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-d3-rotations-vs-flips.mp4)

Caption (verbatim): $D_3$ in 3-dimensional representation

[Verbatim surrounding context](symmetry-d3-rotations-vs-flips/context.md) · [Frame manifest](symmetry-d3-rotations-vs-flips/manifest.json)

Video: `content/drafts/animations/symmetry-d3-rotations-vs-flips.mp4`; SHA-256 `7aeb470b58e5a3bbc7801863594e883b9f1beb28283a29554a6a170abc513dcb`.

1200 × 700; 24 fps; 6.5 s; 156 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. It uses symmetry_d3_rendering for shared geometry, transformations, and drawing, then encodes its frames with FFmpeg. The imported module is a code dependency, not an input movie.

Mapping evidence and limits: The generator explicitly writes symmetry-d3-rotations-vs-flips.mp4; constants specify 1200 x 700 at 24 fps. No matching validation JSON is present. Attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-d3-rotations-vs-flips/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_d3_rotations_vs_flips_animation.py](sources/scripts/generate_symmetry_d3_rotations_vs_flips_animation.py.txt): SHA-256 `c2214d1c0f6c2cfbac1a752ac8d4a377f57275b53cae14c15c3fbd20a3829e01`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_d3_rotations_vs_flips_animation.py)

- [scripts/symmetry_d3_rendering.py](sources/scripts/symmetry_d3_rendering.py.txt): SHA-256 `4be9f7169cfe3654b9a1457de70a65e29dd20cc4863c7445a5ca6155f4453d6c`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/symmetry_d3_rendering.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-d3-rotations-vs-flips/frames/frame-01.jpg)

- [00:00.583, frame 14](symmetry-d3-rotations-vs-flips/frames/frame-02.jpg)

- [00:01.167, frame 28](symmetry-d3-rotations-vs-flips/frames/frame-03.jpg)

- [00:01.750, frame 42](symmetry-d3-rotations-vs-flips/frames/frame-04.jpg)

- [00:02.333, frame 56](symmetry-d3-rotations-vs-flips/frames/frame-05.jpg)

- [00:02.917, frame 70](symmetry-d3-rotations-vs-flips/frames/frame-06.jpg)

- [00:03.542, frame 85](symmetry-d3-rotations-vs-flips/frames/frame-07.jpg)

- [00:04.125, frame 99](symmetry-d3-rotations-vs-flips/frames/frame-08.jpg)

- [00:04.708, frame 113](symmetry-d3-rotations-vs-flips/frames/frame-09.jpg)

- [00:05.292, frame 127](symmetry-d3-rotations-vs-flips/frames/frame-10.jpg)

- [00:05.875, frame 141](symmetry-d3-rotations-vs-flips/frames/frame-11.jpg)

- [00:06.458, frame 155](symmetry-d3-rotations-vs-flips/frames/frame-12.jpg)

## 4. symmetry-d3-irrep-collapse.mp4

Chapter section: Representations

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-d3-irrep-collapse) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-d3-irrep-collapse.mp4)

Caption (verbatim): Reducing 3-dimensional representation to 2-dimensional

[Verbatim surrounding context](symmetry-d3-irrep-collapse/context.md) · [Frame manifest](symmetry-d3-irrep-collapse/manifest.json)

Video: `content/drafts/animations/symmetry-d3-irrep-collapse.mp4`; SHA-256 `74829beaa2e554b3dc0a76253f7eaec8b5360cfbb3efab93945ef587ba80fb77`.

1200 × 720; 24 fps; 23.75 s; 570 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. It uses symmetry_d3_rendering for shared geometry, transformations, and drawing, then encodes its frames with FFmpeg. The imported module is a code dependency, not an input movie.

Mapping evidence and limits: The generator explicitly writes symmetry-d3-irrep-collapse.mp4; constants specify 1200 x 720 at 24 fps. No matching validation JSON is present. Attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-d3-irrep-collapse/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_d3_irrep_collapse_animation.py](sources/scripts/generate_symmetry_d3_irrep_collapse_animation.py.txt): SHA-256 `b2b485ff2947a4c36a48e61f74e22e1ecc8c28c9b1f669360b86cdaeaa99c1c1`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_d3_irrep_collapse_animation.py)

- [scripts/symmetry_d3_rendering.py](sources/scripts/symmetry_d3_rendering.py.txt): SHA-256 `4be9f7169cfe3654b9a1457de70a65e29dd20cc4863c7445a5ca6155f4453d6c`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/symmetry_d3_rendering.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-d3-irrep-collapse/frames/frame-01.jpg)

- [00:02.167, frame 52](symmetry-d3-irrep-collapse/frames/frame-02.jpg)

- [00:04.292, frame 103](symmetry-d3-irrep-collapse/frames/frame-03.jpg)

- [00:06.458, frame 155](symmetry-d3-irrep-collapse/frames/frame-04.jpg)

- [00:08.625, frame 207](symmetry-d3-irrep-collapse/frames/frame-05.jpg)

- [00:10.792, frame 259](symmetry-d3-irrep-collapse/frames/frame-06.jpg)

- [00:12.917, frame 310](symmetry-d3-irrep-collapse/frames/frame-07.jpg)

- [00:15.083, frame 362](symmetry-d3-irrep-collapse/frames/frame-08.jpg)

- [00:17.250, frame 414](symmetry-d3-irrep-collapse/frames/frame-09.jpg)

- [00:19.417, frame 466](symmetry-d3-irrep-collapse/frames/frame-10.jpg)

- [00:21.542, frame 517](symmetry-d3-irrep-collapse/frames/frame-11.jpg)

- [00:23.708, frame 569](symmetry-d3-irrep-collapse/frames/frame-12.jpg)

## 5. symmetry-continuous-so2-translation.mp4

Chapter section: Continuous symmetries

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-continuous-so2-translation) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-continuous-so2-translation.mp4)

Caption (verbatim): Continuous symmetries

[Verbatim surrounding context](symmetry-continuous-so2-translation/context.md) · [Frame manifest](symmetry-continuous-so2-translation/manifest.json)

Video: `content/drafts/animations/symmetry-continuous-so2-translation.mp4`; SHA-256 `63f62f9a684091f29dea57b738da51ac054b51f81acf29a63aa83a4b1b346381`.

1280 × 620; 24 fps; 5 s; 120 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. It draws and encodes the movie directly, then calls make_contact_sheet from _make_contact_sheets to sample the encoded output. The helper does not supply an earlier input movie.

Mapping evidence and limits: main() explicitly writes symmetry-continuous-so2-translation.mp4; constants specify 1280 x 620, 24 fps, 120 frames. No matching validation JSON is present. Attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-continuous-so2-translation/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_continuous_so2_translation_animation.py](sources/scripts/generate_symmetry_continuous_so2_translation_animation.py.txt): SHA-256 `217746be53dc44cb1ded70680fa654bc660f39e594789bdd0807255fb2d2c721`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_continuous_so2_translation_animation.py)

- [scripts/_make_contact_sheets.py](sources/scripts/_make_contact_sheets.py.txt): SHA-256 `9084b8285991d44dcba3ba937cc55ac76d7bc761c9c9cf048d2735cc1f6eadb9`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/_make_contact_sheets.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-continuous-so2-translation/frames/frame-01.jpg)

- [00:00.458, frame 11](symmetry-continuous-so2-translation/frames/frame-02.jpg)

- [00:00.917, frame 22](symmetry-continuous-so2-translation/frames/frame-03.jpg)

- [00:01.333, frame 32](symmetry-continuous-so2-translation/frames/frame-04.jpg)

- [00:01.792, frame 43](symmetry-continuous-so2-translation/frames/frame-05.jpg)

- [00:02.250, frame 54](symmetry-continuous-so2-translation/frames/frame-06.jpg)

- [00:02.708, frame 65](symmetry-continuous-so2-translation/frames/frame-07.jpg)

- [00:03.167, frame 76](symmetry-continuous-so2-translation/frames/frame-08.jpg)

- [00:03.625, frame 87](symmetry-continuous-so2-translation/frames/frame-09.jpg)

- [00:04.042, frame 97](symmetry-continuous-so2-translation/frames/frame-10.jpg)

- [00:04.500, frame 108](symmetry-continuous-so2-translation/frames/frame-11.jpg)

- [00:04.958, frame 119](symmetry-continuous-so2-translation/frames/frame-12.jpg)

## 6. symmetry-so2-vector-field-flow.mp4

Chapter section: Symmetry Flows

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-so2-vector-field-flow) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-so2-vector-field-flow.mp4)

Caption (verbatim): Symmetry flows provide a rich picture of symmetry transformations

[Verbatim surrounding context](symmetry-so2-vector-field-flow/context.md) · [Frame manifest](symmetry-so2-vector-field-flow/manifest.json)

Video: `content/drafts/animations/symmetry-so2-vector-field-flow.mp4`; SHA-256 `8eb47d9c4cc2c5949c9c02c0ae622fc244ea9203c9fe3aa880f1e64e5e51057a`.

1280 × 720; 24 fps; 8.75 s; 210 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. It draws the vector-field-flow frames with Pillow and encodes them with FFmpeg. It has no local Python imports or input movie.

Mapping evidence and limits: main() explicitly writes symmetry-so2-vector-field-flow.mp4; constants specify 1280 x 720, 24 fps, 210 frames. No matching validation JSON is present. Attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-so2-vector-field-flow/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_so2_vector_field_flow_animation.py](sources/scripts/generate_symmetry_so2_vector_field_flow_animation.py.txt): SHA-256 `a966dd1533d8aa529a7412b9a72cf12d3a118d5cf54fc5e1f80c348e82b8054c`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_so2_vector_field_flow_animation.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-so2-vector-field-flow/frames/frame-01.jpg)

- [00:00.792, frame 19](symmetry-so2-vector-field-flow/frames/frame-02.jpg)

- [00:01.583, frame 38](symmetry-so2-vector-field-flow/frames/frame-03.jpg)

- [00:02.375, frame 57](symmetry-so2-vector-field-flow/frames/frame-04.jpg)

- [00:03.167, frame 76](symmetry-so2-vector-field-flow/frames/frame-05.jpg)

- [00:03.958, frame 95](symmetry-so2-vector-field-flow/frames/frame-06.jpg)

- [00:04.750, frame 114](symmetry-so2-vector-field-flow/frames/frame-07.jpg)

- [00:05.542, frame 133](symmetry-so2-vector-field-flow/frames/frame-08.jpg)

- [00:06.333, frame 152](symmetry-so2-vector-field-flow/frames/frame-09.jpg)

- [00:07.125, frame 171](symmetry-so2-vector-field-flow/frames/frame-10.jpg)

- [00:07.917, frame 190](symmetry-so2-vector-field-flow/frames/frame-11.jpg)

- [00:08.708, frame 209](symmetry-so2-vector-field-flow/frames/frame-12.jpg)

## 7. symmetry-rotation-vector-invariants.mp4

Chapter section: Invariants and Metrics

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-rotation-vector-invariants) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-rotation-vector-invariants.mp4)

Caption (verbatim): Metric structure

[Verbatim surrounding context](symmetry-rotation-vector-invariants/context.md) · [Frame manifest](symmetry-rotation-vector-invariants/manifest.json)

Video: `content/drafts/animations/symmetry-rotation-vector-invariants.mp4`; SHA-256 `f82c316a58b99f9882752b4074fbb5fca732796d667707c321812c9e0fcff340`.

1280 × 720; 24 fps; 6 s; 144 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. It draws the rotation-and-invariants frames with Pillow and encodes them with FFmpeg. It has no local Python imports or input movie.

Mapping evidence and limits: main() explicitly writes symmetry-rotation-vector-invariants.mp4; constants specify 1280 x 720, 24 fps, 144 frames. No matching validation JSON is present. Attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-rotation-vector-invariants/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_rotation_vector_invariants_animation.py](sources/scripts/generate_symmetry_rotation_vector_invariants_animation.py.txt): SHA-256 `c8067f8068fa97e6ec940af9a1b55b37c5beefb2c9f8083eba06d97155ec5b60`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_rotation_vector_invariants_animation.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-rotation-vector-invariants/frames/frame-01.jpg)

- [00:00.542, frame 13](symmetry-rotation-vector-invariants/frames/frame-02.jpg)

- [00:01.083, frame 26](symmetry-rotation-vector-invariants/frames/frame-03.jpg)

- [00:01.625, frame 39](symmetry-rotation-vector-invariants/frames/frame-04.jpg)

- [00:02.167, frame 52](symmetry-rotation-vector-invariants/frames/frame-05.jpg)

- [00:02.708, frame 65](symmetry-rotation-vector-invariants/frames/frame-06.jpg)

- [00:03.250, frame 78](symmetry-rotation-vector-invariants/frames/frame-07.jpg)

- [00:03.792, frame 91](symmetry-rotation-vector-invariants/frames/frame-08.jpg)

- [00:04.333, frame 104](symmetry-rotation-vector-invariants/frames/frame-09.jpg)

- [00:04.875, frame 117](symmetry-rotation-vector-invariants/frames/frame-10.jpg)

- [00:05.417, frame 130](symmetry-rotation-vector-invariants/frames/frame-11.jpg)

- [00:05.958, frame 143](symmetry-rotation-vector-invariants/frames/frame-12.jpg)

## 8. symmetry-hyperbolic-rotation.mp4

Chapter section: Invariants and Metrics

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-hyperbolic-rotation) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-hyperbolic-rotation.mp4)

Caption (verbatim): Hyperbolic rotations

[Verbatim surrounding context](symmetry-hyperbolic-rotation/context.md) · [Frame manifest](symmetry-hyperbolic-rotation/manifest.json)

Video: `content/drafts/animations/symmetry-hyperbolic-rotation.mp4`; SHA-256 `17517c198f57608fce58c372da980248bd7ea5bece69ceef0b96da3622742b14`.

1280 × 720; 24 fps; 7 s; 168 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. It draws the hyperbolic-rotation frames with Pillow and encodes them with FFmpeg. It has no local Python imports or input movie.

Mapping evidence and limits: main() explicitly writes symmetry-hyperbolic-rotation.mp4; constants specify 1280 x 720, 24 fps, 168 frames. No matching validation JSON is present. Attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-hyperbolic-rotation/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_hyperbolic_rotation_animation.py](sources/scripts/generate_symmetry_hyperbolic_rotation_animation.py.txt): SHA-256 `cea7f9d590e665552c5bde31f6726efa6b61a2e1d50d9eac4745baada9e86903`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_hyperbolic_rotation_animation.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-hyperbolic-rotation/frames/frame-01.jpg)

- [00:00.625, frame 15](symmetry-hyperbolic-rotation/frames/frame-02.jpg)

- [00:01.250, frame 30](symmetry-hyperbolic-rotation/frames/frame-03.jpg)

- [00:01.917, frame 46](symmetry-hyperbolic-rotation/frames/frame-04.jpg)

- [00:02.542, frame 61](symmetry-hyperbolic-rotation/frames/frame-05.jpg)

- [00:03.167, frame 76](symmetry-hyperbolic-rotation/frames/frame-06.jpg)

- [00:03.792, frame 91](symmetry-hyperbolic-rotation/frames/frame-07.jpg)

- [00:04.417, frame 106](symmetry-hyperbolic-rotation/frames/frame-08.jpg)

- [00:05.042, frame 121](symmetry-hyperbolic-rotation/frames/frame-09.jpg)

- [00:05.708, frame 137](symmetry-hyperbolic-rotation/frames/frame-10.jpg)

- [00:06.333, frame 152](symmetry-hyperbolic-rotation/frames/frame-11.jpg)

- [00:06.958, frame 167](symmetry-hyperbolic-rotation/frames/frame-12.jpg)

## 9. symmetry-so3-rotation-order.mp4

Chapter section: Commutators

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-so3-rotation-order) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-so3-rotation-order.mp4)

Caption (verbatim): Non-commuting operations of $SO_3$

[Verbatim surrounding context](symmetry-so3-rotation-order/context.md) · [Frame manifest](symmetry-so3-rotation-order/manifest.json)

Video: `content/drafts/animations/symmetry-so3-rotation-order.mp4`; SHA-256 `ded432ba59e3b6c415ee80644f09c2e15b7b94d57762df86a6d54f12e90bfdf0`.

1200 × 700; 24 fps; 8 s; 192 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. It uses symmetry_d3_rendering for shared geometry and drawing helpers, then encodes the ordered-rotation frames with FFmpeg. The imported module is a code dependency, not an input movie.

Mapping evidence and limits: render() sets the output stem to symmetry-so3-rotation-order; constants specify 1200 x 700, 24 fps, 192 frames. No matching validation JSON is present. Attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-so3-rotation-order/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_so3_rotation_order_animation.py](sources/scripts/generate_symmetry_so3_rotation_order_animation.py.txt): SHA-256 `0f0602e6786fef7c245fe99e5fe007f2b6dec6176b9960d1c68c0689d3c66a45`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_so3_rotation_order_animation.py)

- [scripts/symmetry_d3_rendering.py](sources/scripts/symmetry_d3_rendering.py.txt): SHA-256 `4be9f7169cfe3654b9a1457de70a65e29dd20cc4863c7445a5ca6155f4453d6c`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/symmetry_d3_rendering.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-so3-rotation-order/frames/frame-01.jpg)

- [00:00.708, frame 17](symmetry-so3-rotation-order/frames/frame-02.jpg)

- [00:01.458, frame 35](symmetry-so3-rotation-order/frames/frame-03.jpg)

- [00:02.167, frame 52](symmetry-so3-rotation-order/frames/frame-04.jpg)

- [00:02.875, frame 69](symmetry-so3-rotation-order/frames/frame-05.jpg)

- [00:03.625, frame 87](symmetry-so3-rotation-order/frames/frame-06.jpg)

- [00:04.333, frame 104](symmetry-so3-rotation-order/frames/frame-07.jpg)

- [00:05.083, frame 122](symmetry-so3-rotation-order/frames/frame-08.jpg)

- [00:05.792, frame 139](symmetry-so3-rotation-order/frames/frame-09.jpg)

- [00:06.500, frame 156](symmetry-so3-rotation-order/frames/frame-10.jpg)

- [00:07.250, frame 174](symmetry-so3-rotation-order/frames/frame-11.jpg)

- [00:07.958, frame 191](symmetry-so3-rotation-order/frames/frame-12.jpg)

## 10. symmetry-translation-point-linearity-failure.mp4

Chapter section: Translations and Function Representation

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-translation-point-linearity-failure) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-translation-point-linearity-failure.mp4)

Caption (verbatim): Shifting a number line is not a linear operation

[Verbatim surrounding context](symmetry-translation-point-linearity-failure/context.md) · [Frame manifest](symmetry-translation-point-linearity-failure/manifest.json)

Video: `content/drafts/animations/symmetry-translation-point-linearity-failure.mp4`; SHA-256 `8e71aef46dd223bb43ca609758f270c3867484b936e193b4f31d6cc60093123c`.

1280 × 720; 24 fps; 6.5 s; 156 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. It renders two separate movies: this point-translation example using draw_point_linearity_frame, and the function-linearity example using its other renderer. Frames are drawn with Pillow and encoded with FFmpeg; no local Python imports or input movie are used.

Mapping evidence and limits: main() pairs the exact symmetry-translation-point-linearity-failure stem with draw_point_linearity_frame. Constants specify 1280 x 720, 24 fps, 156 frames. No matching validation JSON is present; attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-translation-point-linearity-failure/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_translation_linearity_animations.py](sources/scripts/generate_symmetry_translation_linearity_animations.py.txt): SHA-256 `4f89641cae5f356ac6ad2f3606ec88eaf23611baeb0c98f81dcf3fbb920c436b`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_translation_linearity_animations.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-translation-point-linearity-failure/frames/frame-01.jpg)

- [00:00.583, frame 14](symmetry-translation-point-linearity-failure/frames/frame-02.jpg)

- [00:01.167, frame 28](symmetry-translation-point-linearity-failure/frames/frame-03.jpg)

- [00:01.750, frame 42](symmetry-translation-point-linearity-failure/frames/frame-04.jpg)

- [00:02.333, frame 56](symmetry-translation-point-linearity-failure/frames/frame-05.jpg)

- [00:02.917, frame 70](symmetry-translation-point-linearity-failure/frames/frame-06.jpg)

- [00:03.542, frame 85](symmetry-translation-point-linearity-failure/frames/frame-07.jpg)

- [00:04.125, frame 99](symmetry-translation-point-linearity-failure/frames/frame-08.jpg)

- [00:04.708, frame 113](symmetry-translation-point-linearity-failure/frames/frame-09.jpg)

- [00:05.292, frame 127](symmetry-translation-point-linearity-failure/frames/frame-10.jpg)

- [00:05.875, frame 141](symmetry-translation-point-linearity-failure/frames/frame-11.jpg)

- [00:06.458, frame 155](symmetry-translation-point-linearity-failure/frames/frame-12.jpg)

## 11. symmetry-translation-function-linearity.mp4

Chapter section: Translations and Function Representation

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-translation-function-linearity) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-translation-function-linearity.mp4)

Caption (verbatim): A function representation is linear

[Verbatim surrounding context](symmetry-translation-function-linearity/context.md) · [Frame manifest](symmetry-translation-function-linearity/manifest.json)

Video: `content/drafts/animations/symmetry-translation-function-linearity.mp4`; SHA-256 `0d4cfa151e7bb58d86655ba109f676b5ea411c53809f88a8f1862f6e06eaa503`.

1280 × 720; 24 fps; 6.5 s; 156 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. It renders two separate movies: this function-linearity example using draw_function_linearity_frame, and the point-translation example using its other renderer. Frames are drawn with Pillow and encoded with FFmpeg; no local Python imports or input movie are used.

Mapping evidence and limits: main() pairs the exact symmetry-translation-function-linearity stem with draw_function_linearity_frame. Constants specify 1280 x 720, 24 fps, 156 frames. No matching validation JSON is present; attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-translation-function-linearity/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_translation_linearity_animations.py](sources/scripts/generate_symmetry_translation_linearity_animations.py.txt): SHA-256 `4f89641cae5f356ac6ad2f3606ec88eaf23611baeb0c98f81dcf3fbb920c436b`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_translation_linearity_animations.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-translation-function-linearity/frames/frame-01.jpg)

- [00:00.583, frame 14](symmetry-translation-function-linearity/frames/frame-02.jpg)

- [00:01.167, frame 28](symmetry-translation-function-linearity/frames/frame-03.jpg)

- [00:01.750, frame 42](symmetry-translation-function-linearity/frames/frame-04.jpg)

- [00:02.333, frame 56](symmetry-translation-function-linearity/frames/frame-05.jpg)

- [00:02.917, frame 70](symmetry-translation-function-linearity/frames/frame-06.jpg)

- [00:03.542, frame 85](symmetry-translation-function-linearity/frames/frame-07.jpg)

- [00:04.125, frame 99](symmetry-translation-function-linearity/frames/frame-08.jpg)

- [00:04.708, frame 113](symmetry-translation-function-linearity/frames/frame-09.jpg)

- [00:05.292, frame 127](symmetry-translation-function-linearity/frames/frame-10.jpg)

- [00:05.875, frame 141](symmetry-translation-function-linearity/frames/frame-11.jpg)

- [00:06.458, frame 155](symmetry-translation-function-linearity/frames/frame-12.jpg)

## 12. symmetry-function-translation-shape.mp4

Chapter section: Translations and Function Representation

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-function-translation-shape) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-function-translation-shape.mp4)

Caption (verbatim): Translation of functions preserves their shape

[Verbatim surrounding context](symmetry-function-translation-shape/context.md) · [Frame manifest](symmetry-function-translation-shape/manifest.json)

Video: `content/drafts/animations/symmetry-function-translation-shape.mp4`; SHA-256 `70b781ea9a0259674c356828596b2f59ecf49ed5e6daee2fff5b9d0fe5bfe166`.

1280 × 620; 24 fps; 5.5 s; 132 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without --poster-only to draw and encode the translated-function frames. FFmpeg is resolved from configuration, the local tool installation, PATH, or imageio-ffmpeg. No local Python imports or input movie are used.

Mapping evidence and limits: main() explicitly writes symmetry-function-translation-shape.mp4; constants specify 1280 x 620, 24 fps, 132 frames. No matching validation JSON is present. Attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-function-translation-shape/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_function_translation_shape_animation.py](sources/scripts/generate_symmetry_function_translation_shape_animation.py.txt): SHA-256 `b5196f7ba9384160fa221e5d85e30a9602ffecdab222a9dafc58ab4b412fd5dd`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_function_translation_shape_animation.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-function-translation-shape/frames/frame-01.jpg)

- [00:00.500, frame 12](symmetry-function-translation-shape/frames/frame-02.jpg)

- [00:01.000, frame 24](symmetry-function-translation-shape/frames/frame-03.jpg)

- [00:01.500, frame 36](symmetry-function-translation-shape/frames/frame-04.jpg)

- [00:02.000, frame 48](symmetry-function-translation-shape/frames/frame-05.jpg)

- [00:02.500, frame 60](symmetry-function-translation-shape/frames/frame-06.jpg)

- [00:02.958, frame 71](symmetry-function-translation-shape/frames/frame-07.jpg)

- [00:03.458, frame 83](symmetry-function-translation-shape/frames/frame-08.jpg)

- [00:03.958, frame 95](symmetry-function-translation-shape/frames/frame-09.jpg)

- [00:04.458, frame 107](symmetry-function-translation-shape/frames/frame-10.jpg)

- [00:04.958, frame 119](symmetry-function-translation-shape/frames/frame-11.jpg)

- [00:05.458, frame 131](symmetry-function-translation-shape/frames/frame-12.jpg)

## 13. symmetry-translation-tangent-zoom.mp4

Chapter section: Generator of Translations

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-translation-tangent-zoom) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-translation-tangent-zoom.mp4)

Caption (verbatim): A function value is translated by the function's slope

[Verbatim surrounding context](symmetry-translation-tangent-zoom/context.md) · [Frame manifest](symmetry-translation-tangent-zoom/manifest.json)

Video: `content/drafts/animations/symmetry-translation-tangent-zoom.mp4`; SHA-256 `a4db667ace47c5f9a12f280dbb6ac8ef4002e3511aedf2c5824cc67cc5fa9b40`.

1280 × 720; 24 fps; 15 s; 360 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. It draws the translation-and-tangent-zoom frames with Pillow and encodes them with FFmpeg. It has no local Python imports or input movie.

Mapping evidence and limits: render() sets the exact symmetry-translation-tangent-zoom output stem. Constants specify 1280 x 720, 24 fps, 360 frames. No matching validation JSON is present; attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-translation-tangent-zoom/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_translation_tangent_zoom_animation.py](sources/scripts/generate_symmetry_translation_tangent_zoom_animation.py.txt): SHA-256 `3ed12cd6638ecf0dbef49b37d1613cacc0f4dbf94abea8feb907f9efc83c6679`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_translation_tangent_zoom_animation.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-translation-tangent-zoom/frames/frame-01.jpg)

- [00:01.375, frame 33](symmetry-translation-tangent-zoom/frames/frame-02.jpg)

- [00:02.708, frame 65](symmetry-translation-tangent-zoom/frames/frame-03.jpg)

- [00:04.083, frame 98](symmetry-translation-tangent-zoom/frames/frame-04.jpg)

- [00:05.458, frame 131](symmetry-translation-tangent-zoom/frames/frame-05.jpg)

- [00:06.792, frame 163](symmetry-translation-tangent-zoom/frames/frame-06.jpg)

- [00:08.167, frame 196](symmetry-translation-tangent-zoom/frames/frame-07.jpg)

- [00:09.500, frame 228](symmetry-translation-tangent-zoom/frames/frame-08.jpg)

- [00:10.875, frame 261](symmetry-translation-tangent-zoom/frames/frame-09.jpg)

- [00:12.250, frame 294](symmetry-translation-tangent-zoom/frames/frame-10.jpg)

- [00:13.583, frame 326](symmetry-translation-tangent-zoom/frames/frame-11.jpg)

- [00:14.958, frame 359](symmetry-translation-tangent-zoom/frames/frame-12.jpg)

## 14. symmetry-eigenbasis-stretch.mp4

Chapter section: Primer -- Eigenfunctions

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-eigenbasis-stretch) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-eigenbasis-stretch.mp4)

Caption (verbatim): Eigenvectors pictured

[Verbatim surrounding context](symmetry-eigenbasis-stretch/context.md) · [Frame manifest](symmetry-eigenbasis-stretch/manifest.json)

Video: `content/drafts/animations/symmetry-eigenbasis-stretch.mp4`; SHA-256 `627d8caf6e17df54a5c6851f9ca579314a2d120308ea56741b74c40388b9f31e`.

1280 × 720; 24 fps; 14.5 s; 348 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. It draws the eigenbasis-stretch frames with Pillow and encodes them with FFmpeg. It has no local Python imports or input movie.

Mapping evidence and limits: render() sets the exact symmetry-eigenbasis-stretch output stem. Constants specify 1280 x 720 at 24 fps. No matching validation JSON is present; attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-eigenbasis-stretch/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_eigenbasis_stretch_animation.py](sources/scripts/generate_symmetry_eigenbasis_stretch_animation.py.txt): SHA-256 `290c0d3d8b0e69edb127ce8ab7568c60d3679c3eb5b2d012ceb7cdfba2c89f55`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_eigenbasis_stretch_animation.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-eigenbasis-stretch/frames/frame-01.jpg)

- [00:01.333, frame 32](symmetry-eigenbasis-stretch/frames/frame-02.jpg)

- [00:02.625, frame 63](symmetry-eigenbasis-stretch/frames/frame-03.jpg)

- [00:03.958, frame 95](symmetry-eigenbasis-stretch/frames/frame-04.jpg)

- [00:05.250, frame 126](symmetry-eigenbasis-stretch/frames/frame-05.jpg)

- [00:06.583, frame 158](symmetry-eigenbasis-stretch/frames/frame-06.jpg)

- [00:07.875, frame 189](symmetry-eigenbasis-stretch/frames/frame-07.jpg)

- [00:09.208, frame 221](symmetry-eigenbasis-stretch/frames/frame-08.jpg)

- [00:10.500, frame 252](symmetry-eigenbasis-stretch/frames/frame-09.jpg)

- [00:11.833, frame 284](symmetry-eigenbasis-stretch/frames/frame-10.jpg)

- [00:13.125, frame 315](symmetry-eigenbasis-stretch/frames/frame-11.jpg)

- [00:14.458, frame 347](symmetry-eigenbasis-stretch/frames/frame-12.jpg)

## 15. symmetry-complex-plane-wave-v2.mp4

Chapter section: Primer - Complex exponentials and Wave Packets

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-complex-plane-wave-v2) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-complex-plane-wave-v2.mp4)

Caption (verbatim): The complex value rotates while its length stays fixed.

[Verbatim surrounding context](symmetry-complex-plane-wave-v2/context.md) · [Frame manifest](symmetry-complex-plane-wave-v2/manifest.json)

Video: `content/drafts/animations/symmetry-complex-plane-wave-v2.mp4`; SHA-256 `e407d6199cc5539ba3a33469fd1a417d21023bef7461f1acad2ecd11fa903892`.

1440 × 900; 30 fps; 12 s; 360 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Main script --render draws the complex plane-wave frames and encodes them directly. --check and --encoded-check produce the companion mathematical and decoded-video reports. It has no local Python imports or input movie.

Mapping evidence and limits: The script's NAME and output match the linked movie. Matching validation and encoded-validation JSON record 1440 x 900, 30 fps, 360 frames, 12 s. The reports contain no movie hash, so this is source/output-name attribution rather than a hash-attested build.

[Decoded contact sheet](symmetry-complex-plane-wave-v2/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_complex_plane_wave_v2.py](sources/scripts/generate_symmetry_complex_plane_wave_v2.py.txt): SHA-256 `6dc77c751f396bdc8d8a8d78ff7606b9331a5e0a31dc0aa9d2b556a0bbee6fd8`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_complex_plane_wave_v2.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-complex-plane-wave-v2-validation.json](symmetry-complex-plane-wave-v2/checks/symmetry-complex-plane-wave-v2-validation.json): SHA-256 `482c1bdae6e380e4796007acf9c50dbcb46ab0540efa25539400407f25e65cb7`

- [symmetry-complex-plane-wave-v2-encoded-validation.json](symmetry-complex-plane-wave-v2/checks/symmetry-complex-plane-wave-v2-encoded-validation.json): SHA-256 `aad970dd9e74c8f246b365431c9db9c8ab767f338f43a90e1983392284911b6a`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-complex-plane-wave-v2/frames/frame-01.jpg)

- [00:01.100, frame 33](symmetry-complex-plane-wave-v2/frames/frame-02.jpg)

- [00:02.167, frame 65](symmetry-complex-plane-wave-v2/frames/frame-03.jpg)

- [00:03.267, frame 98](symmetry-complex-plane-wave-v2/frames/frame-04.jpg)

- [00:04.367, frame 131](symmetry-complex-plane-wave-v2/frames/frame-05.jpg)

- [00:05.433, frame 163](symmetry-complex-plane-wave-v2/frames/frame-06.jpg)

- [00:06.533, frame 196](symmetry-complex-plane-wave-v2/frames/frame-07.jpg)

- [00:07.600, frame 228](symmetry-complex-plane-wave-v2/frames/frame-08.jpg)

- [00:08.700, frame 261](symmetry-complex-plane-wave-v2/frames/frame-09.jpg)

- [00:09.800, frame 294](symmetry-complex-plane-wave-v2/frames/frame-10.jpg)

- [00:10.867, frame 326](symmetry-complex-plane-wave-v2/frames/frame-11.jpg)

- [00:11.967, frame 359](symmetry-complex-plane-wave-v2/frames/frame-12.jpg)

## 16. symmetry-fourier-three-tone-packet.mp4

Chapter section: The Fourier Structure of Waves

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-fourier-three-tone-packet) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-fourier-three-tone-packet.mp4)

Caption (verbatim): No separate caption in the chapter.

[Verbatim surrounding context](symmetry-fourier-three-tone-packet/context.md) · [Frame manifest](symmetry-fourier-three-tone-packet/manifest.json)

Video: `content/drafts/animations/symmetry-fourier-three-tone-packet.mp4`; SHA-256 `09e84cada72761b75dfe9757ad61add85c19efcc3223b9be4f20c62a74c026de`.

1280 × 720; 24 fps; 8 s; 192 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. Its Fourier-chord renderer draws the three-tone packet frames with Pillow and encodes them with FFmpeg. It has no local Python imports or input movie.

Mapping evidence and limits: Despite the generator filename, render() explicitly sets the output stem to symmetry-fourier-three-tone-packet. Constants specify 1280 x 720, 24 fps, 192 frames. No matching validation JSON is present; attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-fourier-three-tone-packet/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_fourier_chord_packet_animation.py](sources/scripts/generate_symmetry_fourier_chord_packet_animation.py.txt): SHA-256 `3b393e6935e8e605d02a727f38f1c9953f14ee7b0bcbe34ce85aac42086078b6`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_fourier_chord_packet_animation.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-fourier-three-tone-packet/frames/frame-01.jpg)

- [00:00.708, frame 17](symmetry-fourier-three-tone-packet/frames/frame-02.jpg)

- [00:01.458, frame 35](symmetry-fourier-three-tone-packet/frames/frame-03.jpg)

- [00:02.167, frame 52](symmetry-fourier-three-tone-packet/frames/frame-04.jpg)

- [00:02.875, frame 69](symmetry-fourier-three-tone-packet/frames/frame-05.jpg)

- [00:03.625, frame 87](symmetry-fourier-three-tone-packet/frames/frame-06.jpg)

- [00:04.333, frame 104](symmetry-fourier-three-tone-packet/frames/frame-07.jpg)

- [00:05.083, frame 122](symmetry-fourier-three-tone-packet/frames/frame-08.jpg)

- [00:05.792, frame 139](symmetry-fourier-three-tone-packet/frames/frame-09.jpg)

- [00:06.500, frame 156](symmetry-fourier-three-tone-packet/frames/frame-10.jpg)

- [00:07.250, frame 174](symmetry-fourier-three-tone-packet/frames/frame-11.jpg)

- [00:07.958, frame 191](symmetry-fourier-three-tone-packet/frames/frame-12.jpg)

## 17. symmetry-ccr-x-k-translations-symmetric.mp4

Chapter section: The Heisenberg Symmetry Group

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-ccr-x-k-translations-symmetric) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-ccr-x-k-translations-symmetric.mp4)

Caption (verbatim): Wave Packet translated in position and momentum space

[Verbatim surrounding context](symmetry-ccr-x-k-translations-symmetric/context.md) · [Frame manifest](symmetry-ccr-x-k-translations-symmetric/manifest.json)

Video: `content/drafts/animations/symmetry-ccr-x-k-translations-symmetric.mp4`; SHA-256 `117304347b7c29660a1f3a461d385aaed8b99c250a0ddffe5d77a9ac6a3d203f`.

1440 × 810; 30 fps; 17 s; 510 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without --stills-only. It validates the Gaussian Fourier pair, draws both panels with Pillow, and pipes 510 RGB frames to FFmpeg. No local Python imports or input movie are used.

Mapping evidence and limits: The script's NAME exactly matches the linked movie; render() writes that MP4 and decodes a sample at 9.5 s. Constants specify 1440 x 810, 30 fps, 17 s. No matching validation JSON is present, so this is a source/output-name attribution rather than a hash-attested build.

[Decoded contact sheet](symmetry-ccr-x-k-translations-symmetric/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_ccr_x_k_translations_symmetric.py](sources/scripts/generate_symmetry_ccr_x_k_translations_symmetric.py.txt): SHA-256 `3962202e5701486a292cfe2d80f2de89da1197fd8980afce44d077e9032cc4ba`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_ccr_x_k_translations_symmetric.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-ccr-x-k-translations-symmetric/frames/frame-01.jpg)

- [00:01.533, frame 46](symmetry-ccr-x-k-translations-symmetric/frames/frame-02.jpg)

- [00:03.100, frame 93](symmetry-ccr-x-k-translations-symmetric/frames/frame-03.jpg)

- [00:04.633, frame 139](symmetry-ccr-x-k-translations-symmetric/frames/frame-04.jpg)

- [00:06.167, frame 185](symmetry-ccr-x-k-translations-symmetric/frames/frame-05.jpg)

- [00:07.700, frame 231](symmetry-ccr-x-k-translations-symmetric/frames/frame-06.jpg)

- [00:09.267, frame 278](symmetry-ccr-x-k-translations-symmetric/frames/frame-07.jpg)

- [00:10.800, frame 324](symmetry-ccr-x-k-translations-symmetric/frames/frame-08.jpg)

- [00:12.333, frame 370](symmetry-ccr-x-k-translations-symmetric/frames/frame-09.jpg)

- [00:13.867, frame 416](symmetry-ccr-x-k-translations-symmetric/frames/frame-10.jpg)

- [00:15.433, frame 463](symmetry-ccr-x-k-translations-symmetric/frames/frame-11.jpg)

- [00:16.967, frame 509](symmetry-ccr-x-k-translations-symmetric/frames/frame-12.jpg)

## 18. symmetry-ccr-unitarity.mp4

Chapter section: The Heisenberg Symmetry Group

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-ccr-unitarity) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-ccr-unitarity.mp4)

Caption (verbatim): Unitarity of position and wave-number translations

[Verbatim surrounding context](symmetry-ccr-unitarity/context.md) · [Frame manifest](symmetry-ccr-unitarity/manifest.json)

Video: `content/drafts/animations/symmetry-ccr-unitarity.mp4`; SHA-256 `b101e244c9651fa1e0979a1ac7450bd9234d09251a78efd750a888f8bfca636d`.

1440 × 1040; 30 fps; 17 s; 510 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Main script --render writes the MP4; --check and --encoded-check write mathematical and decoded-video validation. The renderer is self-contained apart from external NumPy/Pillow/imageio-ffmpeg libraries.

Mapping evidence and limits: NAME and output path match. content/drafts/animations/symmetry-ccr-unitarity-validation.json records 1440 x 1040, 30 fps, 510 frames, 17 s; the matching encoded-validation.json records the same geometry and frame count and compares decoded frames with source renders.

[Decoded contact sheet](symmetry-ccr-unitarity/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_ccr_unitarity.py](sources/scripts/generate_symmetry_ccr_unitarity.py.txt): SHA-256 `4fca981a5cf3731c12d09aaf28e4c5bbb8aafc528af6fd00a43f42f5eaddef8d`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_ccr_unitarity.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-ccr-unitarity-validation.json](symmetry-ccr-unitarity/checks/symmetry-ccr-unitarity-validation.json): SHA-256 `aaa39897c718ba34f0d3768436f21949a53ee3b77dfa0a30b01f4c99ecf463cd`

- [symmetry-ccr-unitarity-encoded-validation.json](symmetry-ccr-unitarity/checks/symmetry-ccr-unitarity-encoded-validation.json): SHA-256 `5e7d6deb56ef5d4bbb7920cabf4386df820e3d62c26ba4c784752a9d7bbcb88e`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-ccr-unitarity/frames/frame-01.jpg)

- [00:01.533, frame 46](symmetry-ccr-unitarity/frames/frame-02.jpg)

- [00:03.100, frame 93](symmetry-ccr-unitarity/frames/frame-03.jpg)

- [00:04.633, frame 139](symmetry-ccr-unitarity/frames/frame-04.jpg)

- [00:06.167, frame 185](symmetry-ccr-unitarity/frames/frame-05.jpg)

- [00:07.700, frame 231](symmetry-ccr-unitarity/frames/frame-06.jpg)

- [00:09.267, frame 278](symmetry-ccr-unitarity/frames/frame-07.jpg)

- [00:10.800, frame 324](symmetry-ccr-unitarity/frames/frame-08.jpg)

- [00:12.333, frame 370](symmetry-ccr-unitarity/frames/frame-09.jpg)

- [00:13.867, frame 416](symmetry-ccr-unitarity/frames/frame-10.jpg)

- [00:15.433, frame 463](symmetry-ccr-unitarity/frames/frame-11.jpg)

- [00:16.967, frame 509](symmetry-ccr-unitarity/frames/frame-12.jpg)

## 19. symmetry-complex-phase-modes.mp4

Chapter section: The Heisenberg Symmetry Group

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-complex-phase-modes) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-complex-phase-modes.mp4)

Caption (verbatim): Visualizing Phase Change

[Verbatim surrounding context](symmetry-complex-phase-modes/context.md) · [Frame manifest](symmetry-complex-phase-modes/manifest.json)

Video: `content/drafts/animations/symmetry-complex-phase-modes.mp4`; SHA-256 `157579b5ba38bda8a03bce2d88586dd45f37ffb060cf936cedb50e029738ca93`.

1440 × 1080; 30 fps; 18 s; 540 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Main script --render supplies the complex-mode frame renderer and uses drawing, numerical, and encoding helpers imported from generate_symmetry_packet_phase_modes. The imported script is a code dependency, not an input movie. --check and --encoded-check produce the companion checks.

Mapping evidence and limits: Exact NAME match. The matching validation JSON records nine wave numbers 11 through 19, five phase turns, 540 frames at 30 fps, 1440 x 1080, 18 s; encoded-validation.json confirms that frame count and compares decoded frames with this renderer.

[Decoded contact sheet](symmetry-complex-phase-modes/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_complex_phase_modes.py](sources/scripts/generate_symmetry_complex_phase_modes.py.txt): SHA-256 `ca642fc9b34286da0cb58cfd6ea097abd347b9df6b00a7f58ca0f76ae311d39d`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_complex_phase_modes.py)

- [scripts/generate_symmetry_packet_phase_modes.py](sources/scripts/generate_symmetry_packet_phase_modes.py.txt): SHA-256 `47fdf5353988db4807c5e9a21545b3f5dc44b097d7a5b077eec2889333f57edb`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_packet_phase_modes.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-complex-phase-modes-validation.json](symmetry-complex-phase-modes/checks/symmetry-complex-phase-modes-validation.json): SHA-256 `296253a9e08d9b2e9c68c58f928549bb81f4ca8e765607cae326f4e0914a0fd6`

- [symmetry-complex-phase-modes-encoded-validation.json](symmetry-complex-phase-modes/checks/symmetry-complex-phase-modes-encoded-validation.json): SHA-256 `9bb4b715f3def3e25ea8e8e287a778d7e02fcba31fbfdac60eb7b84ce719683e`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-complex-phase-modes/frames/frame-01.jpg)

- [00:01.633, frame 49](symmetry-complex-phase-modes/frames/frame-02.jpg)

- [00:03.267, frame 98](symmetry-complex-phase-modes/frames/frame-03.jpg)

- [00:04.900, frame 147](symmetry-complex-phase-modes/frames/frame-04.jpg)

- [00:06.533, frame 196](symmetry-complex-phase-modes/frames/frame-05.jpg)

- [00:08.167, frame 245](symmetry-complex-phase-modes/frames/frame-06.jpg)

- [00:09.800, frame 294](symmetry-complex-phase-modes/frames/frame-07.jpg)

- [00:11.433, frame 343](symmetry-complex-phase-modes/frames/frame-08.jpg)

- [00:13.067, frame 392](symmetry-complex-phase-modes/frames/frame-09.jpg)

- [00:14.700, frame 441](symmetry-complex-phase-modes/frames/frame-10.jpg)

- [00:16.333, frame 490](symmetry-complex-phase-modes/frames/frame-11.jpg)

- [00:17.967, frame 539](symmetry-complex-phase-modes/frames/frame-12.jpg)

## 20. symmetry-ccr-loop-complex.mp4

Chapter section: The Heisenberg Symmetry Group

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-ccr-loop-complex) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-ccr-loop-complex.mp4)

Caption (verbatim): Phase as the $[\hat X,\hat K]$ commutator

[Verbatim surrounding context](symmetry-ccr-loop-complex/context.md) · [Frame manifest](symmetry-ccr-loop-complex/manifest.json)

Video: `content/drafts/animations/symmetry-ccr-loop-complex.mp4`; SHA-256 `4786dad4ba257da869a943a9098907eb5375beed47e425551094e870bdcf7f70`.

1440 × 900; 30 fps; 16 s; 480 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Main script --render draws the ordered +k,+x,-k,-x loop and uses the imported packet-phase script for shared artwork, math, and encoding libraries. --check and --encoded-check produce companion checks; there is no input movie.

Mapping evidence and limits: Exact NAME match. Matching validation records the -pi/2 residual phase, 480 frames, 30 fps, 1440 x 900, 16 s, and final hold after 13 s. Matching encoded-validation.json confirms the frame count and renderer comparisons.

[Decoded contact sheet](symmetry-ccr-loop-complex/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_ccr_loop_complex.py](sources/scripts/generate_symmetry_ccr_loop_complex.py.txt): SHA-256 `2b515b256661caab4a377b29bdbc4d0e384d054039842e8b4b05a432a6947e27`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_ccr_loop_complex.py)

- [scripts/generate_symmetry_packet_phase_modes.py](sources/scripts/generate_symmetry_packet_phase_modes.py.txt): SHA-256 `47fdf5353988db4807c5e9a21545b3f5dc44b097d7a5b077eec2889333f57edb`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_packet_phase_modes.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-ccr-loop-complex-validation.json](symmetry-ccr-loop-complex/checks/symmetry-ccr-loop-complex-validation.json): SHA-256 `5a2fe33023d8e94ff5b8b4e26893c10a71542b29bfbf7932add277e34c6d5185`

- [symmetry-ccr-loop-complex-encoded-validation.json](symmetry-ccr-loop-complex/checks/symmetry-ccr-loop-complex-encoded-validation.json): SHA-256 `73753f668bb54cbf3a14e22838c462e0d75a134188e956a59b8f203d8c6ce7eb`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-ccr-loop-complex/frames/frame-01.jpg)

- [00:01.467, frame 44](symmetry-ccr-loop-complex/frames/frame-02.jpg)

- [00:02.900, frame 87](symmetry-ccr-loop-complex/frames/frame-03.jpg)

- [00:04.367, frame 131](symmetry-ccr-loop-complex/frames/frame-04.jpg)

- [00:05.800, frame 174](symmetry-ccr-loop-complex/frames/frame-05.jpg)

- [00:07.267, frame 218](symmetry-ccr-loop-complex/frames/frame-06.jpg)

- [00:08.700, frame 261](symmetry-ccr-loop-complex/frames/frame-07.jpg)

- [00:10.167, frame 305](symmetry-ccr-loop-complex/frames/frame-08.jpg)

- [00:11.600, frame 348](symmetry-ccr-loop-complex/frames/frame-09.jpg)

- [00:13.067, frame 392](symmetry-ccr-loop-complex/frames/frame-10.jpg)

- [00:14.500, frame 435](symmetry-ccr-loop-complex/frames/frame-11.jpg)

- [00:15.967, frame 479](symmetry-ccr-loop-complex/frames/frame-12.jpg)

## 21. symmetry-xk-fourier-complex.mp4

Chapter section: Position / Wave Number Uncertainty

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-xk-fourier-complex) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-xk-fourier-complex.mp4)

Caption (verbatim): Trading off spread in position for spread in wave number

[Verbatim surrounding context](symmetry-xk-fourier-complex/context.md) · [Frame manifest](symmetry-xk-fourier-complex/manifest.json)

Video: `content/drafts/animations/symmetry-xk-fourier-complex.mp4`; SHA-256 `3813ae79823f4c00f436d383dc644323c185560bfbb6e1625ce41f7bf17026fa`.

1440 × 900; 30 fps; 12 s; 360 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Main script --render implements the complex Gaussian Fourier-pair sweep. The packet-phase module supplies shared drawing helpers and libraries; no earlier video is consumed. --check and --encoded-check write the companion validation.

Mapping evidence and limits: Exact NAME match. Matching validation records the full complex Fourier check and sigma_x sweep, 360 frames, 30 fps, 1440 x 900, 12 s; encoded-validation.json confirms these video dimensions and compares decoded samples with source frames.

[Decoded contact sheet](symmetry-xk-fourier-complex/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_xk_fourier_complex.py](sources/scripts/generate_symmetry_xk_fourier_complex.py.txt): SHA-256 `bc828211e054f4da43a198d4ee8fa8fe93db2da0258786da8a9b2bb01b4015de`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_xk_fourier_complex.py)

- [scripts/generate_symmetry_packet_phase_modes.py](sources/scripts/generate_symmetry_packet_phase_modes.py.txt): SHA-256 `47fdf5353988db4807c5e9a21545b3f5dc44b097d7a5b077eec2889333f57edb`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_packet_phase_modes.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-xk-fourier-complex-validation.json](symmetry-xk-fourier-complex/checks/symmetry-xk-fourier-complex-validation.json): SHA-256 `4db68f1f87d59fd57b1412af48a31160dde56d62457b617df3cd80071b251aef`

- [symmetry-xk-fourier-complex-encoded-validation.json](symmetry-xk-fourier-complex/checks/symmetry-xk-fourier-complex-encoded-validation.json): SHA-256 `489d51531de2926d4c2511acc0c3247b6b7290537c74c5b9de2b001f7de93f69`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-xk-fourier-complex/frames/frame-01.jpg)

- [00:01.100, frame 33](symmetry-xk-fourier-complex/frames/frame-02.jpg)

- [00:02.167, frame 65](symmetry-xk-fourier-complex/frames/frame-03.jpg)

- [00:03.267, frame 98](symmetry-xk-fourier-complex/frames/frame-04.jpg)

- [00:04.367, frame 131](symmetry-xk-fourier-complex/frames/frame-05.jpg)

- [00:05.433, frame 163](symmetry-xk-fourier-complex/frames/frame-06.jpg)

- [00:06.533, frame 196](symmetry-xk-fourier-complex/frames/frame-07.jpg)

- [00:07.600, frame 228](symmetry-xk-fourier-complex/frames/frame-08.jpg)

- [00:08.700, frame 261](symmetry-xk-fourier-complex/frames/frame-09.jpg)

- [00:09.800, frame 294](symmetry-xk-fourier-complex/frames/frame-10.jpg)

- [00:10.867, frame 326](symmetry-xk-fourier-complex/frames/frame-11.jpg)

- [00:11.967, frame 359](symmetry-xk-fourier-complex/frames/frame-12.jpg)

## 22. symmetry-xk-squared-magnitudes.mp4

Chapter section: Position / Wave Number Uncertainty

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-xk-squared-magnitudes) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-xk-squared-magnitudes.mp4)

Caption (verbatim): Trade-off in uncertainty of position and wave number

[Verbatim surrounding context](symmetry-xk-squared-magnitudes/context.md) · [Frame manifest](symmetry-xk-squared-magnitudes/manifest.json)

Video: `content/drafts/animations/symmetry-xk-squared-magnitudes.mp4`; SHA-256 `889f48b662914160814cd9c0c37c79c5a10525ecab89235e202f93c4d21563be`.

1280 × 720; 24 fps; 12 s; 288 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run the main script without arguments. It draws squared-magnitude frames and uses the imported uncertainty-extremes module for parameters, geometry, fonts, and helpers. It encodes a temporary MP4, replaces the canonical file, then decodes all frames and checks dimensions/fps/count. No earlier movie is consumed.

Mapping evidence and limits: The main script's NAME and render() destination match the linked movie; imported constants specify 1280 x 720, 24 fps, 12 s (288 frames). No matching validation JSON is present; the generator prints its decoded-video verification rather than saving a report. Attribution is by source/output name and pipeline, not a recorded movie hash.

[Decoded contact sheet](symmetry-xk-squared-magnitudes/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_xk_squared_magnitudes_animation.py](sources/scripts/generate_symmetry_xk_squared_magnitudes_animation.py.txt): SHA-256 `6ce05c5954a5de3106b1500c742b9bf6153fe826ab0801247f4f30780523ff9f`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_xk_squared_magnitudes_animation.py)

- [scripts/generate_symmetry_xk_uncertainty_extremes_animation.py](sources/scripts/generate_symmetry_xk_uncertainty_extremes_animation.py.txt): SHA-256 `f6653171c7475bd8be34aa4f79b859e9bac6da7c5051aa3a8ef0738c88b6428d`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_xk_uncertainty_extremes_animation.py)

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-xk-squared-magnitudes/frames/frame-01.jpg)

- [00:01.083, frame 26](symmetry-xk-squared-magnitudes/frames/frame-02.jpg)

- [00:02.167, frame 52](symmetry-xk-squared-magnitudes/frames/frame-03.jpg)

- [00:03.250, frame 78](symmetry-xk-squared-magnitudes/frames/frame-04.jpg)

- [00:04.333, frame 104](symmetry-xk-squared-magnitudes/frames/frame-05.jpg)

- [00:05.417, frame 130](symmetry-xk-squared-magnitudes/frames/frame-06.jpg)

- [00:06.542, frame 157](symmetry-xk-squared-magnitudes/frames/frame-07.jpg)

- [00:07.625, frame 183](symmetry-xk-squared-magnitudes/frames/frame-08.jpg)

- [00:08.708, frame 209](symmetry-xk-squared-magnitudes/frames/frame-09.jpg)

- [00:09.792, frame 235](symmetry-xk-squared-magnitudes/frames/frame-10.jpg)

- [00:10.875, frame 261](symmetry-xk-squared-magnitudes/frames/frame-11.jpg)

- [00:11.958, frame 287](symmetry-xk-squared-magnitudes/frames/frame-12.jpg)

## 23. symmetry-short-wave-beams.mp4

Chapter section: Wave Propagation and Interference

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-short-wave-beams) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-short-wave-beams.mp4)

Caption (verbatim): Interference and Rays

[Verbatim surrounding context](symmetry-short-wave-beams/context.md) · [Frame manifest](symmetry-short-wave-beams/manifest.json)

Video: `content/drafts/animations/symmetry-short-wave-beams.mp4`; SHA-256 `0fdf04ec716792f0956e939ca3f6aac349cb0f3315b200b2a6eb8d07c46634bd`.

1440 × 1120; 30 fps; 20 s; 600 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Main script --render computes finite-opening angular-spectrum fields and encodes their frames. generate_symmetry_widening_apertures supplies shared visual helpers and imported libraries. --check and --encoded-check write the companion reports; no input movie is used.

Mapping evidence and limits: Exact NAME match. Matching validation records fixed opening 0.5, centers -2.4/+2.4, wavelengths 0.5 down to 0.001, and 1440 x 1120, 30 fps, 20 s. Matching encoded-validation.json records all 600 decoded frames and source-frame comparison errors.

[Decoded contact sheet](symmetry-short-wave-beams/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_short_wave_beams.py](sources/scripts/generate_symmetry_short_wave_beams.py.txt): SHA-256 `aa81d6b00bd42d01531e20b7231a663092d69a81bde399fbec577b9038719cb8`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_short_wave_beams.py)

- [scripts/generate_symmetry_widening_apertures.py](sources/scripts/generate_symmetry_widening_apertures.py.txt): SHA-256 `2850a5c705823e498af5ef6180f0639cde6955631a763bc735e3d8992bb35127`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_widening_apertures.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-short-wave-beams-validation.json](symmetry-short-wave-beams/checks/symmetry-short-wave-beams-validation.json): SHA-256 `49603b342c08ee1d2c9d69254ae9aa80d2b7beae9dab12e1d2f8ed256c5a5a2f`

- [symmetry-short-wave-beams-encoded-validation.json](symmetry-short-wave-beams/checks/symmetry-short-wave-beams-encoded-validation.json): SHA-256 `6ffc80015366476539ee23aca3149aea5a2b1ab7134d04053cfbdb90849f3c88`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-short-wave-beams/frames/frame-01.jpg)

- [00:01.800, frame 54](symmetry-short-wave-beams/frames/frame-02.jpg)

- [00:03.633, frame 109](symmetry-short-wave-beams/frames/frame-03.jpg)

- [00:05.433, frame 163](symmetry-short-wave-beams/frames/frame-04.jpg)

- [00:07.267, frame 218](symmetry-short-wave-beams/frames/frame-05.jpg)

- [00:09.067, frame 272](symmetry-short-wave-beams/frames/frame-06.jpg)

- [00:10.900, frame 327](symmetry-short-wave-beams/frames/frame-07.jpg)

- [00:12.700, frame 381](symmetry-short-wave-beams/frames/frame-08.jpg)

- [00:14.533, frame 436](symmetry-short-wave-beams/frames/frame-09.jpg)

- [00:16.333, frame 490](symmetry-short-wave-beams/frames/frame-10.jpg)

- [00:18.167, frame 545](symmetry-short-wave-beams/frames/frame-11.jpg)

- [00:19.967, frame 599](symmetry-short-wave-beams/frames/frame-12.jpg)

## 24. symmetry-double-slit-candidate-paths-shortwave-arcs.mp4

Chapter section: Wave Propagation and Interference

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-double-slit-candidate-paths-shortwave-arcs) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-double-slit-candidate-paths-shortwave-arcs.mp4)

Caption (verbatim): Two Path Interference

[Verbatim surrounding context](symmetry-double-slit-candidate-paths-shortwave-arcs/context.md) · [Frame manifest](symmetry-double-slit-candidate-paths-shortwave-arcs/manifest.json)

Video: `content/drafts/animations/symmetry-double-slit-candidate-paths-shortwave-arcs.mp4`; SHA-256 `f567d8740a19e069ed3e38146db5b7a7672924649866e6bbde34c026bebdb688`.

1440 × 810; 30 fps; 10 s; 300 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: The vivid generator, whose NAME uses the shortwave-arcs stem, is the actual entrypoint (--render). It uses shared artwork from widening_apertures and renders the two-point-aperture phase illustration directly. --check and --encoded-check produce the companion reports.

Mapping evidence and limits: The vivid script explicitly sets NAME to symmetry-double-slit-candidate-paths-shortwave-arcs. Matching validation records wavelength 0.5 and the same A,C,D,B geometry as the script; matching encoded-validation.json records 300 frames, 30 fps, 1440 x 810, 10 s. notes/worked/double-slit-candidate-paths-vivid-animation.md identifies this output.

[Decoded contact sheet](symmetry-double-slit-candidate-paths-shortwave-arcs/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_double_slit_candidate_paths_vivid.py](sources/scripts/generate_symmetry_double_slit_candidate_paths_vivid.py.txt): SHA-256 `1d4eb3263ecd8d430541f6415d985f354769123b54fadc498a451598493f9aff`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_double_slit_candidate_paths_vivid.py)

- [scripts/generate_symmetry_widening_apertures.py](sources/scripts/generate_symmetry_widening_apertures.py.txt): SHA-256 `2850a5c705823e498af5ef6180f0639cde6955631a763bc735e3d8992bb35127`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_widening_apertures.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-double-slit-candidate-paths-shortwave-arcs-validation.json](symmetry-double-slit-candidate-paths-shortwave-arcs/checks/symmetry-double-slit-candidate-paths-shortwave-arcs-validation.json): SHA-256 `c107e456ee7ed53afd28475ef0d50f96d7198f9b11dfe1696ce211255f8fd31d`

- [symmetry-double-slit-candidate-paths-shortwave-arcs-encoded-validation.json](symmetry-double-slit-candidate-paths-shortwave-arcs/checks/symmetry-double-slit-candidate-paths-shortwave-arcs-encoded-validation.json): SHA-256 `0bca767337bc17d6da2d11c9fee2d8c5efee64cab1ab7aac100e250e8182c071`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-double-slit-candidate-paths-shortwave-arcs/frames/frame-01.jpg)

- [00:00.900, frame 27](symmetry-double-slit-candidate-paths-shortwave-arcs/frames/frame-02.jpg)

- [00:01.800, frame 54](symmetry-double-slit-candidate-paths-shortwave-arcs/frames/frame-03.jpg)

- [00:02.733, frame 82](symmetry-double-slit-candidate-paths-shortwave-arcs/frames/frame-04.jpg)

- [00:03.633, frame 109](symmetry-double-slit-candidate-paths-shortwave-arcs/frames/frame-05.jpg)

- [00:04.533, frame 136](symmetry-double-slit-candidate-paths-shortwave-arcs/frames/frame-06.jpg)

- [00:05.433, frame 163](symmetry-double-slit-candidate-paths-shortwave-arcs/frames/frame-07.jpg)

- [00:06.333, frame 190](symmetry-double-slit-candidate-paths-shortwave-arcs/frames/frame-08.jpg)

- [00:07.233, frame 217](symmetry-double-slit-candidate-paths-shortwave-arcs/frames/frame-09.jpg)

- [00:08.167, frame 245](symmetry-double-slit-candidate-paths-shortwave-arcs/frames/frame-10.jpg)

- [00:09.067, frame 272](symmetry-double-slit-candidate-paths-shortwave-arcs/frames/frame-11.jpg)

- [00:09.967, frame 299](symmetry-double-slit-candidate-paths-shortwave-arcs/frames/frame-12.jpg)

## 25. symmetry-many-slit-paths-phasors-interference.mp4

Chapter section: Wave Propagation and Interference

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-many-slit-paths-phasors-interference) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-many-slit-paths-phasors-interference.mp4)

Caption (verbatim): Seeing stationarity emerge in closely spaced paths

[Verbatim surrounding context](symmetry-many-slit-paths-phasors-interference/context.md) · [Frame manifest](symmetry-many-slit-paths-phasors-interference/manifest.json)

Video: `content/drafts/animations/symmetry-many-slit-paths-phasors-interference.mp4`; SHA-256 `05a021cdde8ada00ecd1e43d59d990d0be25a7892cc0cced8b7e047303be2a3e`.

1280 × 720; 24 fps; 22.5 s; 540 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: The same-named canonical entrypoint's main() now delegates to generate_symmetry_desktop_wave_bookends.render_canonical_desktop(); its older draw_frame helpers alone do not reproduce the accepted movie. V7 adds a 96-frame intensity-colored wave intro to a 444-frame centered 49-slit body, then concatenates with FFmpeg stream copy. The recorded build reused content/drafts/animations/iterations/symmetry-many-slit-paths-phasors-interference-20260911T150313560139Z-centered-body.mp4, with its .model.json record; running the canonical entrypoint regenerates that body, while the bookends script supports --reuse-middle. Shared geometry imports pass through the old canonical helpers, wave_paths_explainer, and step2_packet_summary_point. All five main V7 implementation/model files are byte-identical to their scripts/iterations/*-20260911T155628136531Z-v7.py snapshots.

Mapping evidence and limits: Canonical validation identifies iterations/symmetry-many-slit-paths-phasors-interference-v7-intensity-in-the-wave.mp4, 540 frames, 24 fps, 22.5 s, 1280 x 720, the exact body input, and middle_decoded_frames_identical=true. The current MP4 SHA-256 matches its recorded video_sha256 (05a021cdde8ada00ecd1e43d59d990d0be25a7892cc0cced8b7e047303be2a3e). notes/worked/desktop-wave-intensity-field.md confirms the canonical entrypoint and V7 implementation.

[Decoded contact sheet](symmetry-many-slit-paths-phasors-interference/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_many_slit_paths_phasors_interference.py](sources/scripts/generate_symmetry_many_slit_paths_phasors_interference.py.txt): SHA-256 `4b8845f4529bdb1c8643be72b3b415cd305bc01ac54cda304bac840529eb2b54`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_many_slit_paths_phasors_interference.py)

- [scripts/generate_symmetry_desktop_wave_bookends.py](sources/scripts/generate_symmetry_desktop_wave_bookends.py.txt): SHA-256 `b6ff52349323d0ce825fad7fc091664b3a3c1a4e166ec23eb2ef605316b1c0ba`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_desktop_wave_bookends.py)

- [scripts/generate_symmetry_slit_tip_to_tail.py](sources/scripts/generate_symmetry_slit_tip_to_tail.py.txt): SHA-256 `a75b1c5c5d966911d6a031e3d8c8826acefb18dce40b5171590896ce0d1b4d6d`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_slit_tip_to_tail.py)

- [scripts/perforated_tip_to_tail_model.py](sources/scripts/perforated_tip_to_tail_model.py.txt): SHA-256 `4c1f497fd6b3508bca022da68099561cb8900868511d99510b2a5e6ceff7c4a7`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/perforated_tip_to_tail_model.py)

- [scripts/corrected_tip_to_tail_model.py](sources/scripts/corrected_tip_to_tail_model.py.txt): SHA-256 `6f399befabb8d5cbb22f120d00db405a1aafc513287a8a878c755f0be3d834c9`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/corrected_tip_to_tail_model.py)

- [scripts/generate_symmetry_wave_paths_explainer.py](sources/scripts/generate_symmetry_wave_paths_explainer.py.txt): SHA-256 `aa6b8924891f48279963539ebd9e5134bb18a1e58c112ac5c40f96c09a6eb111`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_wave_paths_explainer.py)

- [scripts/generate_symmetry_step2_packet_summary_point.py](sources/scripts/generate_symmetry_step2_packet_summary_point.py.txt): SHA-256 `9286e2052586ef1958124f5d77ac0a3228eea6f8d9c738b382bdbe51f9d0eb0a`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_step2_packet_summary_point.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-many-slit-paths-phasors-interference-validation.json](symmetry-many-slit-paths-phasors-interference/checks/symmetry-many-slit-paths-phasors-interference-validation.json): SHA-256 `ec7c61f355e16478b5afbc1d6e48c69ad556e345eb651e9f855e1446e9a35bd7`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-many-slit-paths-phasors-interference/frames/frame-01.jpg)

- [00:02.042, frame 49](symmetry-many-slit-paths-phasors-interference/frames/frame-02.jpg)

- [00:04.083, frame 98](symmetry-many-slit-paths-phasors-interference/frames/frame-03.jpg)

- [00:06.125, frame 147](symmetry-many-slit-paths-phasors-interference/frames/frame-04.jpg)

- [00:08.167, frame 196](symmetry-many-slit-paths-phasors-interference/frames/frame-05.jpg)

- [00:10.208, frame 245](symmetry-many-slit-paths-phasors-interference/frames/frame-06.jpg)

- [00:12.250, frame 294](symmetry-many-slit-paths-phasors-interference/frames/frame-07.jpg)

- [00:14.292, frame 343](symmetry-many-slit-paths-phasors-interference/frames/frame-08.jpg)

- [00:16.333, frame 392](symmetry-many-slit-paths-phasors-interference/frames/frame-09.jpg)

- [00:18.375, frame 441](symmetry-many-slit-paths-phasors-interference/frames/frame-10.jpg)

- [00:20.417, frame 490](symmetry-many-slit-paths-phasors-interference/frames/frame-11.jpg)

- [00:22.458, frame 539](symmetry-many-slit-paths-phasors-interference/frames/frame-12.jpg)

## 26. symmetry-schematic-screens-v3-concise.mp4

Chapter section: Wave Propagation and Interference

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-schematic-screens-v3-concise) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-schematic-screens-v3-concise.mp4)

Caption (verbatim): Huygens–Fresnel principle

[Verbatim surrounding context](symmetry-schematic-screens-v3-concise/context.md) · [Frame manifest](symmetry-schematic-screens-v3-concise/manifest.json)

Video: `content/drafts/animations/symmetry-schematic-screens-v3-concise.mp4`; SHA-256 `66887f22e7e0dae166c0e097a20ef5256c28be0e9192eb803e6af168e0d0a24b`.

1280 × 720; 24 fps; 24 s; 576 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Final entrypoint is retime_symmetry_schematic_screens.py, which consumes content/drafts/animations/symmetry-schematic-screens-v3.mp4. Generate that 52-second source with generate_symmetry_schematic_screens_v3.py --render; its listed local imports supply construction state, field model, and drawing helpers. The final script applies whole-frame monotone FFmpeg setpts/fps retiming to 24 seconds, without recomputing fields or interpolating frames. Source-to-output knots are 0:0, 2:1, 22:7, 42:17, 48:21, 52:24 seconds.

Mapping evidence and limits: The concise validation explicitly names the v3 input and retiming method and records 576 frames, 24 fps, 1280 x 720, 24 s. Both current movies match its source_sha256 and video_sha256 fields (source 4fca2f3e85cddef6ae2e85b0fbb400b157c807dfebdb86cc9df76be8cf298da2; final 66887f22e7e0dae166c0e097a20ef5256c28be0e9192eb803e6af168e0d0a24b).

[Decoded contact sheet](symmetry-schematic-screens-v3-concise/frames/contact-sheet.jpg)

Source files:

- [scripts/retime_symmetry_schematic_screens.py](sources/scripts/retime_symmetry_schematic_screens.py.txt): SHA-256 `d6801c0b61fb87e9e202633c31b0fc5853268614fef2db5ce5846f8365de4db9`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/retime_symmetry_schematic_screens.py)

- [scripts/generate_symmetry_schematic_screens_v3.py](sources/scripts/generate_symmetry_schematic_screens_v3.py.txt): SHA-256 `fdba8977d904d4bea5de26b701e095c01e3a24e2fe79ab65251d7fcfa3d3d615`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_schematic_screens_v3.py)

- [scripts/schematic_screens_v3_model.py](sources/scripts/schematic_screens_v3_model.py.txt): SHA-256 `c094ccf24f356709e2ff2a103ecad4ae716c2bafbcbc7f2040c41c106bb3f7fa`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/schematic_screens_v3_model.py)

- [scripts/generate_symmetry_schematic_screens_v2.py](sources/scripts/generate_symmetry_schematic_screens_v2.py.txt): SHA-256 `e5d7fa0d52eefbcfb839dbc48565299901d49914fc9f48fd1aaab548f842c2ba`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_schematic_screens_v2.py)

- [scripts/generate_symmetry_schematic_screens.py](sources/scripts/generate_symmetry_schematic_screens.py.txt): SHA-256 `6e31805fd5a4de5bd4b19ed3c2a6a035ca6458e2389dab5162a0567186b07977`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_schematic_screens.py)

- [scripts/generate_symmetry_plane_wave_screens.py](sources/scripts/generate_symmetry_plane_wave_screens.py.txt): SHA-256 `0085a1a626f9ba5bfb88cb22974b4c65692dddc7afcf97165b9751c320331381`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_plane_wave_screens.py)

- [scripts/plane_wave_screens_model.py](sources/scripts/plane_wave_screens_model.py.txt): SHA-256 `627e82993ba8de74005677c6dc5b5afafe8f3a801a8b0ebde7ffd368b51ea420`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/plane_wave_screens_model.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-schematic-screens-v3-concise-validation.json](symmetry-schematic-screens-v3-concise/checks/symmetry-schematic-screens-v3-concise-validation.json): SHA-256 `e1991adcb42c874b12663ad78e83e353d3e9eb8a4c5420d9454a8a236d647b55`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-schematic-screens-v3-concise/frames/frame-01.jpg)

- [00:02.167, frame 52](symmetry-schematic-screens-v3-concise/frames/frame-02.jpg)

- [00:04.375, frame 105](symmetry-schematic-screens-v3-concise/frames/frame-03.jpg)

- [00:06.542, frame 157](symmetry-schematic-screens-v3-concise/frames/frame-04.jpg)

- [00:08.708, frame 209](symmetry-schematic-screens-v3-concise/frames/frame-05.jpg)

- [00:10.875, frame 261](symmetry-schematic-screens-v3-concise/frames/frame-06.jpg)

- [00:13.083, frame 314](symmetry-schematic-screens-v3-concise/frames/frame-07.jpg)

- [00:15.250, frame 366](symmetry-schematic-screens-v3-concise/frames/frame-08.jpg)

- [00:17.417, frame 418](symmetry-schematic-screens-v3-concise/frames/frame-09.jpg)

- [00:19.583, frame 470](symmetry-schematic-screens-v3-concise/frames/frame-10.jpg)

- [00:21.792, frame 523](symmetry-schematic-screens-v3-concise/frames/frame-11.jpg)

- [00:23.958, frame 575](symmetry-schematic-screens-v3-concise/frames/frame-12.jpg)

## 27. symmetry-phase-remainder-spinners.mp4

Chapter section: Wave Propagation and Interference

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-phase-remainder-spinners) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-phase-remainder-spinners.mp4)

Caption (verbatim): No separate caption in the chapter.

[Verbatim surrounding context](symmetry-phase-remainder-spinners/context.md) · [Frame manifest](symmetry-phase-remainder-spinners/manifest.json)

Video: `content/drafts/animations/symmetry-phase-remainder-spinners.mp4`; SHA-256 `bb3a49c2b2cb17d33c7a5e67dd057eb1efa4c07e4f7d06390caad1214601360a`.

1440 × 870; 60 fps; 17 s; 1020 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Use the current main script --render, with --check and --encoded-check for validation. It imports general drawing/encoding helpers from two_tip_to_tail_limits. Archived phase-remainder v1/v2 scripts and movies are earlier variants; the current generator shows left endpoints at 30,60,90 degrees.

Mapping evidence and limits: Matching validation records lengths 1,2,3, wavelengths 12 and 5/47, right remainders 144,288,72 degrees, 1020 frames at 60 fps, 1440 x 870, 17 s. Matching encoded-validation.json confirms all 1020 frames. notes/worked/phase-remainder-spinners.md identifies the current generator and explicitly distinguishes the archived v1/v2 variants.

[Decoded contact sheet](symmetry-phase-remainder-spinners/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_phase_remainder_spinners.py](sources/scripts/generate_symmetry_phase_remainder_spinners.py.txt): SHA-256 `ab2938d03e2a08d4e00e7294e353ba38d863d74b3ec27fef0d77c3ec5c0fdd42`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_phase_remainder_spinners.py)

- [scripts/generate_symmetry_two_tip_to_tail_limits.py](sources/scripts/generate_symmetry_two_tip_to_tail_limits.py.txt): SHA-256 `9a7e8081dc0333b30ba0d85cd49552af8cc9377a65b2bae582b7d1c5043bae12`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_two_tip_to_tail_limits.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-phase-remainder-spinners-validation.json](symmetry-phase-remainder-spinners/checks/symmetry-phase-remainder-spinners-validation.json): SHA-256 `8112603c8770b320ff3f83bfab3c4fe8119cbd6fe082d1cc6e7f3e874872cf61`

- [symmetry-phase-remainder-spinners-encoded-validation.json](symmetry-phase-remainder-spinners/checks/symmetry-phase-remainder-spinners-encoded-validation.json): SHA-256 `5ab818c503620129176f021755901d3af0b68b490ae46f5669ba1acb8e55eab4`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-phase-remainder-spinners/frames/frame-01.jpg)

- [00:01.550, frame 93](symmetry-phase-remainder-spinners/frames/frame-02.jpg)

- [00:03.083, frame 185](symmetry-phase-remainder-spinners/frames/frame-03.jpg)

- [00:04.633, frame 278](symmetry-phase-remainder-spinners/frames/frame-04.jpg)

- [00:06.183, frame 371](symmetry-phase-remainder-spinners/frames/frame-05.jpg)

- [00:07.717, frame 463](symmetry-phase-remainder-spinners/frames/frame-06.jpg)

- [00:09.267, frame 556](symmetry-phase-remainder-spinners/frames/frame-07.jpg)

- [00:10.800, frame 648](symmetry-phase-remainder-spinners/frames/frame-08.jpg)

- [00:12.350, frame 741](symmetry-phase-remainder-spinners/frames/frame-09.jpg)

- [00:13.900, frame 834](symmetry-phase-remainder-spinners/frames/frame-10.jpg)

- [00:15.433, frame 926](symmetry-phase-remainder-spinners/frames/frame-11.jpg)

- [00:16.983, frame 1019](symmetry-phase-remainder-spinners/frames/frame-12.jpg)

## 28. symmetry-spectrum-path-diamond-wavelength-scan.mp4

Chapter section: Wave Propagation and Interference

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-spectrum-path-diamond-wavelength-scan) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-spectrum-path-diamond-wavelength-scan.mp4)

Caption (verbatim): No separate caption in the chapter.

[Verbatim surrounding context](symmetry-spectrum-path-diamond-wavelength-scan/context.md) · [Frame manifest](symmetry-spectrum-path-diamond-wavelength-scan/manifest.json)

Video: `content/drafts/animations/symmetry-spectrum-path-diamond-wavelength-scan.mp4`; SHA-256 `20b1b041404d6a38d47cf4b9e638fbb4eaf620ddf22e76f0417e9f335134209f`.

1440 × 1080; 60 fps; 36 s; 2160 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Main script --render configures the normalized-path renderer with fixed path-position colors, then calls drawing.render() from dense_path_diamond through normalized_path_diamond. These imported modules supply the normalized propagation model, frame schedule, geometry, and general drawing helpers. There is no input video; --check and --encoded-check produce validation.

Mapping evidence and limits: Main NAME matches exactly; configure_renderer installs this movie name and frame implementation in the reused renderer. Matching validation records 20,001 paths, wavelengths 0.5/0.05/0.005, 2160 frames at 60 fps, 36 s, fixed path/color hashes, and unchanged normalized scalar propagation. Matching encoded-validation.json records 1440 x 1080 and confirms all frames.

[Decoded contact sheet](symmetry-spectrum-path-diamond-wavelength-scan/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_spectrum_path_diamond.py](sources/scripts/generate_symmetry_spectrum_path_diamond.py.txt): SHA-256 `581d06457b5e0baefeace9f540d1e46b6d06b459e60dc250b7394d5776cba13d`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_spectrum_path_diamond.py)

- [scripts/generate_symmetry_normalized_path_diamond.py](sources/scripts/generate_symmetry_normalized_path_diamond.py.txt): SHA-256 `9fc3910cc091e5f3825d7e25636e16ef9f5d412da001dff04f507a4d03572009`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_normalized_path_diamond.py)

- [scripts/generate_symmetry_dense_path_diamond.py](sources/scripts/generate_symmetry_dense_path_diamond.py.txt): SHA-256 `931e8990decd2d1bd9ecffb036d774cd7a634a189e3e7ef41c1cf7b61984ea17`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_dense_path_diamond.py)

- [scripts/generate_symmetry_two_tip_to_tail_limits.py](sources/scripts/generate_symmetry_two_tip_to_tail_limits.py.txt): SHA-256 `9a7e8081dc0333b30ba0d85cd49552af8cc9377a65b2bae582b7d1c5043bae12`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_two_tip_to_tail_limits.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-spectrum-path-diamond-wavelength-scan-validation.json](symmetry-spectrum-path-diamond-wavelength-scan/checks/symmetry-spectrum-path-diamond-wavelength-scan-validation.json): SHA-256 `333ef80306d1c29f5bc95b7f29937150c488f693ed058ec14726eac7a864a2cf`

- [symmetry-spectrum-path-diamond-wavelength-scan-encoded-validation.json](symmetry-spectrum-path-diamond-wavelength-scan/checks/symmetry-spectrum-path-diamond-wavelength-scan-encoded-validation.json): SHA-256 `512843f7eead1c9d266ebf8dd68de97bdda0daa80d96ae210f959bfa425ab11c`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-spectrum-path-diamond-wavelength-scan/frames/frame-01.jpg)

- [00:03.267, frame 196](symmetry-spectrum-path-diamond-wavelength-scan/frames/frame-02.jpg)

- [00:06.550, frame 393](symmetry-spectrum-path-diamond-wavelength-scan/frames/frame-03.jpg)

- [00:09.817, frame 589](symmetry-spectrum-path-diamond-wavelength-scan/frames/frame-04.jpg)

- [00:13.083, frame 785](symmetry-spectrum-path-diamond-wavelength-scan/frames/frame-05.jpg)

- [00:16.350, frame 981](symmetry-spectrum-path-diamond-wavelength-scan/frames/frame-06.jpg)

- [00:19.633, frame 1178](symmetry-spectrum-path-diamond-wavelength-scan/frames/frame-07.jpg)

- [00:22.900, frame 1374](symmetry-spectrum-path-diamond-wavelength-scan/frames/frame-08.jpg)

- [00:26.167, frame 1570](symmetry-spectrum-path-diamond-wavelength-scan/frames/frame-09.jpg)

- [00:29.433, frame 1766](symmetry-spectrum-path-diamond-wavelength-scan/frames/frame-10.jpg)

- [00:32.717, frame 1963](symmetry-spectrum-path-diamond-wavelength-scan/frames/frame-11.jpg)

- [00:35.983, frame 2159](symmetry-spectrum-path-diamond-wavelength-scan/frames/frame-12.jpg)

## 29. symmetry-amplitude-probability.mp4

Chapter section: From Wave Mechanics to Quantum Mechanics

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-amplitude-probability) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-amplitude-probability.mp4)

Caption (verbatim): From intensity to position measurement probability density

[Verbatim surrounding context](symmetry-amplitude-probability/context.md) · [Frame manifest](symmetry-amplitude-probability/manifest.json)

Video: `content/drafts/animations/symmetry-amplitude-probability.mp4`; SHA-256 `1c8983aa042f447817ec993a7139134c5d2c412565f7d32badf6e8f487886adf`.

1920 × 1080; 30 fps; 28 s; 840 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Main script --render adapts accepted Reel 11 to landscape. It imports detector_state from episodes_quantum and artwork/math helpers from core; neither a portrait MP4 nor a postprocessor is consumed. --verify-video can refresh decoded-video validation without rerendering.

Mapping evidence and limits: Exact STEM/output match. Validation names the normalized paraxial Gaussian model, seeds 73921/73922, wave numbers 8/160, and a video block reporting 840 frames, 30 fps, 1920 x 1080, 28 s. The current MP4 matches that block's SHA-256 (1c8983aa042f447817ec993a7139134c5d2c412565f7d32badf6e8f487886adf).

[Decoded contact sheet](symmetry-amplitude-probability/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_amplitude_probability.py](sources/scripts/generate_symmetry_amplitude_probability.py.txt): SHA-256 `4bf9b265921515b60eda56c3b8c7726f54b7576c77cab9cd0e2cd7447561e8e7`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_amplitude_probability.py)

- [scripts/ccr2_reels/episodes_quantum.py](sources/scripts/ccr2_reels/episodes_quantum.py.txt): SHA-256 `b0e163a0e6a1a4f9e67da78cc2150c45bf60fec27a7df89221fe2795e2d2abf3`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/ccr2_reels/episodes_quantum.py)

- [scripts/ccr2_reels/core.py](sources/scripts/ccr2_reels/core.py.txt): SHA-256 `ea6b4f78ba40628d37cacae2b5cac175cd2442b0afa1d35fabdb4d5081384dd8`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/ccr2_reels/core.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-amplitude-probability-validation.json](symmetry-amplitude-probability/checks/symmetry-amplitude-probability-validation.json): SHA-256 `1c125b794980d0b210d6e3611c61a665f2ec509f7b74e1a3de0835d80d9e6644`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-amplitude-probability/frames/frame-01.jpg)

- [00:02.533, frame 76](symmetry-amplitude-probability/frames/frame-02.jpg)

- [00:05.100, frame 153](symmetry-amplitude-probability/frames/frame-03.jpg)

- [00:07.633, frame 229](symmetry-amplitude-probability/frames/frame-04.jpg)

- [00:10.167, frame 305](symmetry-amplitude-probability/frames/frame-05.jpg)

- [00:12.700, frame 381](symmetry-amplitude-probability/frames/frame-06.jpg)

- [00:15.267, frame 458](symmetry-amplitude-probability/frames/frame-07.jpg)

- [00:17.800, frame 534](symmetry-amplitude-probability/frames/frame-08.jpg)

- [00:20.333, frame 610](symmetry-amplitude-probability/frames/frame-09.jpg)

- [00:22.867, frame 686](symmetry-amplitude-probability/frames/frame-10.jpg)

- [00:25.433, frame 763](symmetry-amplitude-probability/frames/frame-11.jpg)

- [00:27.967, frame 839](symmetry-amplitude-probability/frames/frame-12.jpg)

## 30. symmetry-collision-shared-scale.mp4

Chapter section: From Wave Mechanics to Quantum Mechanics

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-collision-shared-scale) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-collision-shared-scale.mp4)

Caption (verbatim): A shared conversion factor makes phase and action select the same collision

[Verbatim surrounding context](symmetry-collision-shared-scale/context.md) · [Frame manifest](symmetry-collision-shared-scale/manifest.json)

Video: `content/drafts/animations/symmetry-collision-shared-scale.mp4`; SHA-256 `643b2fb49af55e498bcfecd3f8d610c91b4697d58a2683bf0de2579752b3f55a`.

1600 × 900; 24 fps; 30 s; 720 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Main script --render first writes review stills and numerical validation, then directly encodes the shared-scale collision illustration and appends decoded-video metadata to its validation report. It has no local Python imports or input movie.

Mapping evidence and limits: The script's STEM and output match the linked movie. Matching validation JSON records 1600 x 900, 24 fps, 720 frames, 30 s, and confirms those values in its encoded_video block. It contains no movie hash, so this is source/output-name attribution rather than a hash-attested build.

[Decoded contact sheet](symmetry-collision-shared-scale/frames/contact-sheet.jpg)

Source files:

- [scripts/generate_symmetry_collision_shared_scale.py](sources/scripts/generate_symmetry_collision_shared_scale.py.txt): SHA-256 `2baf2763d05bfd3654c9bb9202dc7a0454f3ca6d4fe965079a87c42c06918868`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/generate_symmetry_collision_shared_scale.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-collision-shared-scale-validation.json](symmetry-collision-shared-scale/checks/symmetry-collision-shared-scale-validation.json): SHA-256 `45a7200089400e0d39c1743ecc3c88c74479f8aa59baa5586263ddf6830e855f`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-collision-shared-scale/frames/frame-01.jpg)

- [00:02.708, frame 65](symmetry-collision-shared-scale/frames/frame-02.jpg)

- [00:05.458, frame 131](symmetry-collision-shared-scale/frames/frame-03.jpg)

- [00:08.167, frame 196](symmetry-collision-shared-scale/frames/frame-04.jpg)

- [00:10.875, frame 261](symmetry-collision-shared-scale/frames/frame-05.jpg)

- [00:13.625, frame 327](symmetry-collision-shared-scale/frames/frame-06.jpg)

- [00:16.333, frame 392](symmetry-collision-shared-scale/frames/frame-07.jpg)

- [00:19.083, frame 458](symmetry-collision-shared-scale/frames/frame-08.jpg)

- [00:21.792, frame 523](symmetry-collision-shared-scale/frames/frame-09.jpg)

- [00:24.500, frame 588](symmetry-collision-shared-scale/frames/frame-10.jpg)

- [00:27.250, frame 654](symmetry-collision-shared-scale/frames/frame-11.jpg)

- [00:29.958, frame 719](symmetry-collision-shared-scale/frames/frame-12.jpg)

## 31. symmetry-action-phase-desktop.mp4

Chapter section: From Wave Mechanics to Quantum Mechanics

[In the public chapter](https://wadelamble.github.io/constrained-improvisation/symmetry/#animation-symmetry-action-phase-desktop) · [Play or download the full MP4](https://wadelamble.github.io/constrained-improvisation/assets/animations/symmetry-action-phase-desktop.mp4)

Caption (verbatim): No separate caption in the chapter.

[Verbatim surrounding context](symmetry-action-phase-desktop/context.md) · [Frame manifest](symmetry-action-phase-desktop/manifest.json)

Video: `content/drafts/animations/symmetry-action-phase-desktop.mp4`; SHA-256 `dcbd69a9b39fa15cc4b082395a1fb799acc1877360429143fa18c997984a6492`.

1920 × 1080; 42 fps; 24 s; 1008 frames. Extraction: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.

Generation: Run render_action_phase_desktop.py --render. It directly encodes landscape frames using the shared state and timing constants from revise_action_phase and drawing primitives from core. The remaining listed modules are transitive imports through revise_action_phase/retitle_live; their portrait packaging and retiming entrypoints are not executed by the desktop build, and no earlier movie is consumed.

Mapping evidence and limits: Exact STEM and output match. Matching validation explicitly identifies shared_state=revise_action_phase.state and records masses 1/2/3 eV, proper-time interval 0..12 fs, 1008 frames at 42 fps, 1920 x 1080, 24 s. It verifies shell/proper-time/phase/action invariants but contains no MP4 hash, so source attribution is not a hash-attested build.

[Decoded contact sheet](symmetry-action-phase-desktop/frames/contact-sheet.jpg)

Source files:

- [scripts/ccr2_reels/render_action_phase_desktop.py](sources/scripts/ccr2_reels/render_action_phase_desktop.py.txt): SHA-256 `17c442c4f187fa48779bf7e8e7d5df42ca77f25f53062c0e9d82e872a3305130`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/ccr2_reels/render_action_phase_desktop.py)

- [scripts/ccr2_reels/revise_action_phase.py](sources/scripts/ccr2_reels/revise_action_phase.py.txt): SHA-256 `c771209296928a17809d5f0d9789f0774af363b47949589a1fb0ed694c117664`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/ccr2_reels/revise_action_phase.py)

- [scripts/ccr2_reels/core.py](sources/scripts/ccr2_reels/core.py.txt): SHA-256 `ea6b4f78ba40628d37cacae2b5cac175cd2442b0afa1d35fabdb4d5081384dd8`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/ccr2_reels/core.py)

- [scripts/ccr2_reels/render.py](sources/scripts/ccr2_reels/render.py.txt): SHA-256 `a76fb42cc469a255b42a87307dbc5a95e6acc84ac89ea42159599e88afa6e573`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/ccr2_reels/render.py)

- [scripts/ccr2_reels/retitle_live.py](sources/scripts/ccr2_reels/retitle_live.py.txt): SHA-256 `f72b785c1e1d1b84309cbb397267d9dc4586711562c3d1b60e5ce28bc2b4aaf2`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/ccr2_reels/retitle_live.py)

- [scripts/ccr2_reels/validate_retime.py](sources/scripts/ccr2_reels/validate_retime.py.txt): SHA-256 `14dbc097067c5ddabf95bddb18cdf402ff9dee5e96a89d201c28825a27a27864`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/ccr2_reels/validate_retime.py)

- [scripts/ccr2_reels/retime.py](sources/scripts/ccr2_reels/retime.py.txt): SHA-256 `18e2d96a281771c7ca0219525476a6f2042200e04af074b14326a7ea9619fe42`; [GitHub pinned source](https://github.com/wadelamble/constrained-improvisation/blob/974f9de352542963116af37c417ad68cd3a2c101/scripts/ccr2_reels/retime.py)

Existing generator checks:

These are existing author-produced generator reports, copied without changes. Their checks were not rerun for this packet and are not independent certification. A report may describe an earlier generation run; inspect its contents before applying its claims to the current movie.

- [symmetry-action-phase-desktop-validation.json](symmetry-action-phase-desktop/checks/symmetry-action-phase-desktop-validation.json): SHA-256 `a6c7567b764d7ff28dd272c8ee36b54cb8a27866b309f063755d335883456345`

Sampled frames (zero-based indices):

- [00:00.000, frame 0](symmetry-action-phase-desktop/frames/frame-01.jpg)

- [00:02.190, frame 92](symmetry-action-phase-desktop/frames/frame-02.jpg)

- [00:04.357, frame 183](symmetry-action-phase-desktop/frames/frame-03.jpg)

- [00:06.548, frame 275](symmetry-action-phase-desktop/frames/frame-04.jpg)

- [00:08.714, frame 366](symmetry-action-phase-desktop/frames/frame-05.jpg)

- [00:10.905, frame 458](symmetry-action-phase-desktop/frames/frame-06.jpg)

- [00:13.071, frame 549](symmetry-action-phase-desktop/frames/frame-07.jpg)

- [00:15.262, frame 641](symmetry-action-phase-desktop/frames/frame-08.jpg)

- [00:17.429, frame 732](symmetry-action-phase-desktop/frames/frame-09.jpg)

- [00:19.619, frame 824](symmetry-action-phase-desktop/frames/frame-10.jpg)

- [00:21.786, frame 915](symmetry-action-phase-desktop/frames/frame-11.jpg)

- [00:23.976, frame 1007](symmetry-action-phase-desktop/frames/frame-12.jpg)
