# Camera Shakify 0.5.1 render-path reproduction

This bounded fixture checks one driver-backed camera on frames 1, 13 and 37 in
Blender 5.2.0 LTS on Linux x86_64, using background Workbench renders.
The recorded Blender build reports hash `fbe6228777e7` from source revision
`fbe6228777e7d9afefcd61a413844e790ae75db7`. The runner checks the release and
build hash before it executes the fixture.

It compares:

1. the ordinary project with Camera Shakify enabled, installed but disabled,
   and absent;
2. the publisher-prepared project with the extension absent and Blender's
   automatic Python execution allowed or blocked.

The recorded result is in [`artifact.json`](./artifact.json). A small contact
sheet shows the rendered states. Pixel-hash relationships, rather than the
contact sheet, are the assertions; camera matrices remain in rerun output as
diagnostics. Its rows are ordinary/enabled,
ordinary/absent, prepared/script allowed, and prepared/script blocked; columns
are frames 1, 13 and 37.

## Rerun

Download the official Camera Shakify 0.5.1 archive from the
[Blender Extensions listing](https://extensions.blender.org/add-ons/camera-shakify/).
Do not use an archive unless its SHA-256 is:

`40bb62e0960b301fe8c7b1de11ec959b8ce6c55ce03ed720c5c3b21c0c764e36`

From this directory, run:

```bash
./run.sh /absolute/path/to/blender-5.2.0 /absolute/path/to/add-on-camera-shakify-v0.5.1.zip /absolute/output/directory
```

`run.sh` requires Docker. When its default image is absent, it builds the small
runtime in [`runtime.Dockerfile`](./runtime.Dockerfile) from a pinned Ubuntu
22.04 image. That image build needs package-network access; the candidate
archive is not mounted or executed during the build. Every Blender process
runs later with no network, a read-only root filesystem, no host home or
credentials, dropped Linux capabilities and bounded resources. The runner
rejects Blender releases other than 5.2.0 and build hashes other than
`fbe6228777e7`. The candidate archive is mounted read-only and extracted inside
the container.

A rerun checks the same state relationships. Graphics drivers, hardware and
other runtime differences can change pixels, so this artifact does not promise
byte-identical output across environments.

The prepared file contains an embedded publisher script. The harness runs that
file only inside the isolated container, once with `--enable-autoexec` and once
with `--disable-autoexec`. Allow embedded Python only for files and sources you
trust.

## Boundary

This is one procedural cube-and-camera fixture, not feature coverage. It does
not establish behavior for other presets, Blender versions, operating systems
or render engines. No extension archive or `.blend` file is redistributed.
The screenshots contain only the procedurally created fixture.

Public sources: [tagged README](https://github.com/EatTheFuture/camera_shakify/blob/a59d9f91dd899dd5e8539dec1e7d5d2c69516920/README.md),
[farm preparation code](https://github.com/EatTheFuture/camera_shakify/blob/a59d9f91dd899dd5e8539dec1e7d5d2c69516920/farm_script.py),
and [Blender scripting security](https://docs.blender.org/manual/en/latest/advanced/scripting/security.html).
