Repository navigation
Versions and Upgrading
What each version of artwright changed, which changes reach a caller of aw.py or a reader of verdict.json, and
what to do when moving to 0.7.2. The reasons for every change are in the
CHANGELOG.
| Version | On main
|
Tagged | What it brought |
|---|---|---|---|
| 0.7.2 | 2026-10-26 (8006f0d) |
yes, v0.7.2 (release) |
smooth JPEG block rejection works through ffmpeg; grain and edge measuring sizes documented |
| 0.7.1 | 2026-10-26 (516f320) |
yes, v0.7.1 on 2026-10-26 (release) |
pixel finds a scale 2 or 3 grid in a high-quality JPEG, with grid.lattice_contrast
|
| 0.7.0 | 2026-10-25 (bf6864d) |
yes, v0.7.0 on 2026-10-26 (release) |
pixel craft numbers, reported and never failed: banding, pillow shading, corner doubles, interior jaggies, --bg grounds, tile repetition; degrade banding and pillow; pixel-art, AI-look and material rows in the knowledge files |
| 0.6.0 | 2026-10-25 (0624da4) |
no, ships inside 0.7.0 | an averaged measuring copy, value as L*, notan cuts where the values divide, light separation, the grain estimate and comp's noise floor, the JPEG block guard in pixel, grey contact sheets, degrade noise, band and alias |
| 0.5.0 | 2026-10-24 (f2658f1) |
no, ships inside 0.7.0 |
setfit (one illustration against its series), comp --text-band, rubric 3 with a mechanism criterion |
| 0.4.2 | 2026-10-24 (e2de3c2) |
yes, v0.4.2 on 2026-10-24 (release) |
transparent pixels left out of transitional_pixels
|
| 0.4.1 | 2026-10-24 (5b94dcd) |
no, ships inside 0.4.2 |
pixel --scale 1 reports blend pixels without failing native art |
| 0.4.0 | 2026-10-23 (b2b73a6) |
yes, v0.4.0 on 2026-10-24 (release) |
geomgate and sprite in a new aw_geom.py; transparent pixels left out of stats and the measures |
| 0.3.0 | 2026-10-22 (7e71b28) |
yes, v0.3.0 on 2026-10-23, the first tag (release) |
rubric 2, rank cycles, the winner check, the cache sampling key, the side shown first on labels; new craft and AI-look rows in the knowledge files |
| 0.2.0 | 2026-10-22 (5b5213f) |
no, ships inside 0.3.0 |
light, gamut, accents, depth and comp in a new aw_measure.py; new stats fields; seven new degrade kinds |
| 0.1.1 | 2026-10-22 (8ee7740) |
no, ships inside 0.3.0 | a tie in both orders resolves as a tie; exit codes stated in the README; paid-tier eval fixes to the skill descriptions |
| 0.1.0 | 2026-10-21 (08b7e56) |
no | the four skills and aw.py
|
The "On main" commit is where the script's version string first changed. Six versions have tags and releases:
0.3.0, 0.4.0, 0.4.2, 0.7.0, 0.7.1 and 0.7.2. Anyone on another version installed from the default branch at some commit.
python aw.py --version says which version you have; 0.7.2 prints 0.7.2. The manifest moved to 0.1.1 only at
8ee7740, after some 0.1.1 fixes (the tie fix among them) were already on main, so a copy that says 0.1.0 may or
may not have them.
- In Claude Code, update the
artwrightmarketplace and plugin from the/pluginmenu, or remove them and install again with the two commands on Getting started. Not run for this wiki. - With copied skill folders, replace all four folders under your agent's skills folder with the ones from a fresh
clone or from
artwright-0.7.2.zipon the release page. Replace them together: the siblings run the hub's script, and from 0.4.0 that script is three files (aw.py,aw_measure.py,aw_geom.py). -
Your private record (
ARTWRIGHT_HOME, default~/.artwright) needs no change. Its files keep their format; only new cache rows and labels carry extra fields. Rows stored under an older rubric version are no longer found by default (below).
The smooth quality 55 JPEG now reads as scale 1 through ffmpeg as well as Pillow. The guard keeps its 0.8
threshold and checks luma as well as RGB; explicit --scale still bypasses it. Genuine scale 2 fixtures pass
through both decoders. No PNG behavior changes. The grain-copy and edges_info documentation now states the
actual measuring size. The verdict contract and stored records are unchanged.
These were found by running this wiki's script against the v0.4.2 tag and the v0.7.1 tag and comparing every
section of the two outputs, and against the saved 0.3.0 output. No field the 0.4.2 run printed was removed or
renamed, apart from the JPEG grid fields named below; every other change is a new field, a new command or a new
number.
aw_geom.py must sit beside aw.py (since 0.4.0). An aw.py with only aw_measure.py beside it fails on
every command with No module named 'aw_geom'
(Errors and edge cases).
Three new commands, listed by python aw.py with no command: geomgate and sprite (0.4.0) and setfit
(0.5.0) (Commands).
stats value numbers moved (0.6.0). value.mean is now lightness, L*/100, where it was luma, and the key cuts
moved from 0.35 and 0.65 to 0.38 and 0.68. For the test landscape dusk.png, 0.4.2 printed "mean": 0.535 and
0.7.1 prints "mean": 0.561 with "luma_mean": 0.535 beside it; the key stayed middle. Code that compared
value.mean with a fixed number should read value.luma_mean or be re-checked. New in stats: value.scale,
value.luma_mean, noise, and the notan's cuts and shares; alpha came in 0.4.0.
Every measure's numbers moved a little (0.6.0), because the 256 px measuring copy now averages every source
pixel. On the test pictures, flags stayed the same except one: comp on the tangent test image (dusk_tangent.png)
now also flags competing_focal, with a focal margin of 0.015 (it was 0.038). light gained separation, and
comp's sharpness gained noise_sigma and noise_floor
(Light, colour and composition).
pixel items gained fields (0.7.0): banding, corner_doubles, jaggies_interior and pillow, tile's
gradient_lr, gradient_tb, detail_spread, flat_border_sides and repetition_suspected, and with --bg,
edge_lost_on_bg. They are reported only: no new number has a pass line yet, so clean_pixel_art and problems
are the same as in 0.4.2 for every PNG test sprite (CHANGELOG C-20261025-2, LEARNINGS L-019).
JPEG grids (0.6.0 and 0.7.1). The smooth test JPEG that 0.4.2 read as scale 2 (native 384 x 384) now reads as
scale 1 with a note, and the scale 2 palette sprite at quality 90 that 0.4.2 read as scale 1 now reads as scale 2
with lattice_contrast. Without Pillow the first guard does not fire
(Errors and edge cases).
The cache's default rubric version is 3 (0.5.0). 0.4.2's cache get built the key
...|artwright-judge|2|claude-opus-5-5|1; 0.7.1 builds ...|artwright-judge|3|claude-opus-5-5|1, so rows stored
by 0.3.0 to 0.4.2 are missed and those images are judged again under rubric 3. --rubric-version 2 still finds
them (Commands). verdict init writes rubric version 3 into a new verdict.json; the contract version stays "1".
Contact sheets are grey (0.6.0): cells sit on 119, 119, 119 rather than white; sheet --bg 255,255,255 gives
the old look. The JSON sheet prints is unchanged.
degrade --kind accepts five more kinds (noise, band, alias, banding, pillow) and takes --amount,
so the usage text for a bad --kind lists nineteen (Commands).
What changed up to 0.3.0; everything in the 0.3.0 to 0.4.2 section above applies on top. These were found by
running the same script against 0.1.0 (commit 997f5b9) and 0.3.0 and comparing every section of the two outputs.
Everything not listed printed the same.
aw_measure.py must sit beside aw.py. A setup that copied aw.py alone now fails on every command
(Errors and edge cases).
Five new commands, listed by python aw.py with no command: accents, comp, depth, gamut and light
(Light, colour and composition).
stats gained fields and lost none. value gained middle_share, bimodality, clip_black, clip_white,
highlight_tint and a note; temperature gained b_mean, b_sd and a note; there is a new chroma_cells
object. Every field 0.1.0 printed has the same value for the same image (Commands).
rank output gained three keys, cycles, cycle_count and top_in_cycle, and its note is longer. A row
inside a three-way loop now gets close_to_next: true even when its strength is well ahead
(How images are judged). Code that reads ranking, games and abstained keeps
working.
The cache's default rubric version moved to 2 in 0.3.0 (and to 3 in 0.5.0). The key holds the rubric version, so every cache get without
--rubric-version now misses rows stored by 0.1.0 to 0.2.0, and the judge judges those images again. The key
0.1.0 built for the same call:
f152d4d30a807dc9d6b4ed2fe8ad398d2fe16c7e8db4e96c0c3b45505beb5307|artwright-judge|1|claude-opus-5-5|1
and the one 0.3.0 builds:
f152d4d30a807dc9d6b4ed2fe8ad398d2fe16c7e8db4e96c0c3b45505beb5307|artwright-judge|2|claude-opus-5-5|1
The old rows stay in verdicts.jsonl and --rubric-version 1 still finds them (Commands), but
they were judged under the old rubric. New rows also carry temperature and seed fields, null when not given,
and cache stats lists each rubric version it has seen ("artwright-judge@1", "artwright-judge@2").
verdict init wrote rubric version 2 (3 since 0.5.0) into a new verdict.json
({'id': 'artwright-judge', 'version': '2'}). The contract version itself stays "1": no field was removed or
renamed (Verdict contract).
cache agreement gained labels_with_order and labels_first_shown_share, and cache label takes
--shown-first a|b (How images are judged).
degrade --kind accepts seven more kinds, so the usage text for a bad --kind lists fourteen
(Commands).
Fixed in 0.1.1. In 0.1.0, a pair whose two orders were both recorded as tie resolved as decided with no
winner, and rank counted it as a win for the second file. Recording the same two ties
(compare record 7313d500b577 1 tie, then 2 tie), 0.1.0's second record printed:
{
"pair": "7313d500b577",
"resolved": {
"status": "decided",
"winner": null,
"flipped": false
},
"ok": true
}
and 0.3.0's prints:
{
"pair": "7313d500b577",
"resolved": {
"status": "tie",
"winner": null,
"flipped": false
},
"ok": true
}
rank then gives both files "ties": 1, equal strengths, close_to_next: true on the first row, and lists the
pair under abstained with "reason": "tie". If you have work folders ranked by 0.1.0 that contain a pair tied in
both orders, run rank on them again; nothing needs re-judging, because the records themselves did not change.
Everything in the 0.3.0 row above applies, and then the 0.3.0 to 0.4.2 section. The rubric version moved to 2, so the cache misses described under
0.1.0 apply to rows stored by 0.2.0 too. rank reports cycles. --temperature and --seed join the cache key
only when given, so a call without them still finds rows stored without them. cache label takes
--shown-first. The judge skill now checks the batch winner against the brief before reporting it. The curator
skill shows a person's calibration pairs in a random order and records which side came first.
These change what the skills say rather than what aw.py prints, so no output above shows them:
-
0.7.0: the pixel skill reports the craft numbers in its first step; its pixel-art reference gained nine craft rows with banding, pillow shading and doubles defined against the numbers; the sprites and tiles reference gained loop and flicker timing and tile repetition; the judge's AI-look list gained rows 30 to 34; the hub's craft notes gained material cues (CHANGELOG C-20261025-2).
-
0.5.0: rubric 3 adds a sixth criterion, Mechanism (does the machine work as drawn), a gate like integrity; in a batch, a candidate that joins a series runs
setfitfirst and one that fails a measure is listed with it, not ranked (How images are judged). -
0.4.0: when a batch was painted over 3D renders, the judge runs
geomgateon each and ranks only those that pass; the pixel skill says painted sprites are not pixel art and checks them withaw.py spriteinstead. -
0.3.0: the hub's craft notes gained sections on light logic and on atmosphere and distance, and a rewritten composition section. Its eye-path row now says where a viewer looks first; it used to say that lines carry the eye. The judge's AI-look list gained rows 17 to 29, each naming the
comp,lightordepthflag that points at it. Rubric 2 is on How images are judged. -
0.2.0: the hub's description names "an image's light, composition or main colours", and the hub runs the measures before answering such questions.
-
0.1.1: the hub answers "is this AI-made" by opening with what pixels cannot tell; the judge's description names prompt rewrites into a style or artist.
This wiki describes artwright 0.7.2 (the v0.7.2 tag, commit a185c05) and was last updated on 2026-10-26. The plugin is MIT licensed. Report problems in the issues. It installs from the repository, m4bwav/artwright, or from the 0.7.2 release.
Using it
- Getting started
- Skills
- Commands
- Light, colour and composition
- How images are judged
- Verdict contract
- Errors and edge cases
- Recipes
- FAQ
The releases
Contributing
Elsewhere