Drawing Machine

Tests and findings

What is checked automatically, what is checked on every run, and every tool limit met along the way, each with the image that showed it.

The test suite (tests/test_intend.mjs)

Run on synthetic canvases at build time:

ok   reserve-paper lowers its loss (0.256 -> 0.102)
ok   no change outside the rect
ok   protected rect untouched
ok   commands replay exactly
ok   connect-mass lowers its loss (0.197 -> 0.007)
ok   soften-edge lowers contrast loss (0.415 -> 0.360)
ok   final edge passes integrity (pocket +0.057, in 1.86px, out 0.00px)
ok   a zero-tolerance guard admits fewer actions (0 vs 14 commands)
ok   conflicting intention reverted (undid dark-band (0.0000 -> 0.0073))
ok   canvas is back to the state the first intention left
ok   break-edge lowers its loss (1.000 -> 0.000, 31 commands)
ok   no committed move beyond maxShift (max 10.0 px)
ok   unknown kernel is refused
all passed
checkwhat it establishes
reserve-paper lowers its loss; nothing changes outside its rect; a protected rect is untouchedthe region and protection guards hold for eraser actions
commands replay exactlyan edit is a record that reproduces the canvas bit for bit
connect-mass fills a gapdeposits follow a guide
soften-edge lowers contrast and the final edge passes integrity; a zero-tolerance guard admits fewer actionsthe edge-integrity guard constrains the softening
a conflicting later intention is reverted, and the canvas returns to the earlier statecommitments are kept across a sitting
break-edge adds wander within maxShifta ruled edge can be broken without moving it far
an unknown kernel is refuseda note with no kernel does not acquire an invented meaning

Checked on every run

Findings and operating windows

evidencefinding
A language model writing stroke coordinates draws mechanically.
the paint simulator sheets 1-3: outlines and patches; the reason for this build.
The first PyTorch planner halves its residual but does not read as hands.
Coarse planning grid, stand-in mismatch, side-stroke blobs. Parked.
Hands' mark scale is fixed.
900-1100 px reads well; at 1800 px the same marks make a vaguer drawing.
Hands keys the tone covering most of a target to paper.
A dark ground came out white (still life 3-1). Fixed with --absolute: a white band below while drawing, cropped afterwards; the vendored engine is unchanged.
The --absolute band left a seam.
Fixed by carrying the image's last row into the band.
Pale halos around darks in dark-field drawings.
The engine's local-contrast step lifts the field beside a dark. A tool signature, named so it is not read as intent.
A corridor loss is satisfied by a stripe.
The black and the neck came out as cords (sheet 4 D). Fixed with 5 probes across and the softness guard (D2).
A hatch dragged along a path makes a ladder.
Hatches are now laid as patches at the hand's own slant (sheet 4 P to P2).
Paths spaced wider than the stamp step make dotted marks.
Proposal paths are now sampled the way Hands' tracer samples them (dense()).
Wander has to be large to read.
4 px of edge wander is measurable and invisible; 10 px reads (sheet 4 E to E4).
Eraser bites inside a dark leave pale worms.
break-edge pulls inside the pool (sheet 5 loop 2 O); healed by connect-mass (P).
A squint keeps the silhouette.
Two values of a cat are still a cat (sheet 5 G); the silhouette is the noun.
An eraser cannot fully lift dense charcoal.
Ghost legs stayed (sheet 5 H), as in the material.
Generators resolve ambiguity into nouns.
A blocked-in head became a dog; a black became a cat; a back of the head gained a face.
Measured predictions and the eye can disagree.
Sheet 5 artist K met the visual goals while black solidity and the focus measure moved the wrong way; both recorded.
The translator finds conditions, not meanings.
It found the ruled edges and the missing black, missed the neck, and proposed closing a reserved white.
The tilted cup in the stage is wrong.
Still life set 1 #6 was untested for that reason.
The relation is in the arrangement, not the medium.
The same scene in Rembrandt's pen keeps the inside/outside darks (still life 3-6).
The academic eye level loses the still life's relation.
At 35 degrees it weakens; at 22 it is gone (passage2).
Rendering a generator image back through our renderer lifts its blacks.
Black share 0.144 to 0.004 with no edit at all. The final applies only the native change to the source pixels.
A stump at this resolution reads as a blur; a veil keeps the grain.
Still life loop 1 T4 against T5.