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.
- Ten generatorsSeven field generators emit closed-form expressions; three form generators emit point recipes.
- Refinement you can readEvery step records its parameters, scores and the weakest axis it moved toward.
- Honest labelsA result short of the target is labelled best-effort, never verified.
- No dependenciesNode 18 or newer, or a browser that imports the same module.
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.
- 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
- 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 - 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 - 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-refinegives a one-step trajectory at 0.8237 and a different World id.Source: src/criteria.js,
tag - 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
- 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.
Get it
Clone it. Node 18 or newer, no install step.
$ git clone https://github.com/HarperZ9/reconcile && cd reconcileFirst 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.00Compose 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)See it in a browser
Serve the folder and open
web/index.htmlto 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
- The criteria are coarse aesthetic axes. A high cohesion is a measured read of those axes and makes no claim about beauty or quality.
- The content hash is cyrb53, a fast digest for identity and tamper evidence. It is not cryptographic.
- The engine emits shader programs and point recipes as data and checks them on the CPU. Rendering and audio belong to the host.
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.