shadertoy-cli 2.2.7

Agent-friendly ShaderToy project, rendering, debugging, and live-preview CLI
Blind comparisons let an agent make a visual judgment before learning which
source or parameter values produced each anonymous variant.

Create a blind comparison from arbitrary existing images or render directories:

  shadertoy blind create old.png new.png
  shadertoy blind create target/old-renders target/new-renders \
    --output-dir target/old-vs-new

Image directories are searched recursively for PNG/JPEG files and sorted
deterministically. Every source must contain the same number of images at the
same dimensions. The contact sheet uses anonymous variants A/B/C as columns and
corresponding source images as rows.

Project directories and built STTF artifacts can be rendered at matching frames:

  shadertoy blind create old-project new-project \
    --frames 0,60,120 --width 1280 --height 720

  shadertoy blind create old.sttf new.sttf \
    --frames 0,60,120 --width 1280 --height 720

Project sources use their manifest render defaults unless width/height/fps are
overridden. STTF sources default to 1280x720 at 60 fps unless overridden.

Git revisions can be compared without manually checking them out:

  shadertoy blind create \
    'git:v2.2.6::examples/demo' \
    'git:HEAD::examples/demo' \
    --frames 0,60,120

Use --git-root PATH when the command is not running inside the repository. The
form git:REF points at the worktree root; git:REF::SUBDIR selects a file or
directory inside that revision. Comparing a live working tree against its
committed base is therefore as simple as passing the project directory as one
source and git:HEAD::PATH as the other.

Parameter sweeps can still create the same blind workflow directly:

  shadertoy sweep --blind --frame 120 --set u_foam_gain=0.8,1.0,1.2

Both forms randomize the variant order, create blind-contact-sheet.png, and
write anonymous A/B/C outputs. The public blind-session.json and normal command
output intentionally omit the source/parameter mapping.

Record the visual decision before revealing:

  shadertoy blind judge target/blind-comparison/blind-session.json \
    --pick B \
    --reason "Best crest breakup without flattening the mid-frequency chop."

For longer notes, use --reason-file notes.md instead of --reason. A session
accepts one judgment and cannot be judged after it has been revealed.

Then reveal:

  shadertoy blind reveal target/blind-comparison/blind-session.json

Reveal is refused until a judgment exists. It writes blind-reveal.json with the
recorded judgment, selected variant identity/settings, and the full A/B/C
mapping. JSON mode returns the same combined report for agent tooling.

The hidden .blind-mapping.bin artifact is intentionally opaque to ordinary text
inspection so identities do not leak into normal agent context before judgment.
This is a workflow guard against evaluation bias, not a security or
cryptographic boundary: an actor deliberately inspecting implementation details
can bypass it.