HarperZ9/reconcileExplainer, built from commit ba20136All repository explainers

reconcile

Turn creative generators into replayable browser worlds.

What it does for you

A generated image is easier to trust when you can see how it was made and make it again. reconcile runs a generator, scores the result against criteria the generator did not write, adjusts its parameters toward the weakest score, and writes everything into one World record: the shader program, the refinement path, a motion timeline, a palette and a receipt. The same generator and seed give the same World in Node and in the browser.

Source: README.md at ba20136 (version 0.2.0)

Watch

No concept film fits this tool closely yet. The walkthrough below covers it in text, with real commands and output.

Video walkthrough: coming with the next release.

How it works, one step at a time

Scroll, or use the step buttons. Every line is output from node cli.js at commit ba20136, mostly from create gyroid --seed 7 and the World JSON it wrote.

  1. 01

    Pick a generator and a seed

    The library has ten generators. Seven describe a field as a formula over u, v and t: gyroid, quasicrystal, flowfield, turbulence, metaballs, rings and moire. Three produce point sets: phyllotaxis, attractor and harmonograph. Every one has the same interface, so the engine treats them alike.

    The walk-through uses the gyroid with seed 7.

    Source: src/organs, src/organ.js

  2. 02

    Score it on every axis

    The gyroid is sampled and scored from 0 to 1 on axes it did not author: how close its frequency sits to a whole number, its contrast, its complexity, and its novelty against earlier results. The overall cohesion is the harmonic mean, so one weak axis pulls the whole score down.

    At the seed's starting point, with frequency 6.928, cohesion is 0.8237 and contrast is the weakest axis.

    Source: src/criteria.js, src/refine.js, evaluate

  3. 03

    Refine toward the weakest axis

    Refinement tries moving each parameter up and down, keeps the move that raises cohesion most, and halves its step when nothing helps. Each step is recorded. Over ten steps the frequency falls from 6.928 to 2, a whole number, and z rises to 0.28. Cohesion climbs to 0.8624.

    Source: src/refine.js, refine

  4. 04

    Short of the target is best-effort

    The target is a cohesion of 0.9 with every axis at 0.6 or above. The gyroid stops at 0.8624, so the result is labelled unverifiable, best-effort, and the record says it did not converge. Contrast at 0.73 is still the weakest axis.

    Skipping refinement with --no-refine gives a one-step trajectory at 0.8237 and a different World id.

    Source: src/criteria.js, tag

  5. 05

    Emit a program, a timeline and a receipt

    The World carries the shader as data: a GLSL fragment program for the field sin(2u)cos(2v) + sin(2v)cos(2t) + sin(2t)cos(2u), with the refined frequency of 2. A motion timeline with a period of pi seconds is checked for a loop with no jump and for staying on criterion. A six-colour palette and a receipt with the seed, generator, content hash and witness close the record.

    Source: src/world.js, src/temporal.js, src/expr.js

  6. 06

    Same input, same World

    Run the same command again and the World id and witness are identical. Change the seed or the refinement setting and both change. Pick each run in the panel.

    Source: README.md, "What to test first"

Walkthrough

Install it, run it once, then use the main feature. Each command below is real, and so is its output.

  1. Get it

    Clone it. Node 18 or newer, no install step.

    $ git clone https://github.com/HarperZ9/reconcile && cd reconcile
  2. First run: create a world

    Generate a gyroid at seed 7. It is refined toward its weakest axis and labelled best-effort when it stops short of the target.

    $ node cli.js create gyroid --seed 7 --out out
    reasoning: 10 steps ยท cohesion 0.8624
    margins: clean_freq=1.00 contrast=0.73 complexity=0.79 novelty=1.00
  3. Compose two generators

    Layer two generators and score the composition.

    $ node cli.js compose gyroid,phyllotaxis --seed 7
    composition: 0.5829 (depth_complementarity=0.425, contrast_balance=0.9273)
  4. See it in a browser

    Serve the folder and open web/index.html to run the same engine and render the shader in WebGL.

    $ python -m http.server

Output from cli.js at ba20136 with Node on Windows. npm test reported 25 tests passing.

What it does not do

Source: README.md at ba20136, "Honest scope" and "Current status"

Check what stuck

Answer each one in your head before you open it.

Why does one weak axis pull cohesion down so far?

Cohesion is the harmonic mean of the axis scores.

The gyroid stops at 0.8624. What label does it get?

Unverifiable, best-effort: it is under the 0.9 target.

What happens to the World id if you rerun seed 7?

It stays the same: 0ccddf32f6535e.