# Sheet 4: Hands engine, chosen direction (p1 #4 structure)

Stages (all native Kollwitz-charcoal Hands strokes on one canvas; generator images used as targets only):

- A: 4285 strokes from planA (p1 #4 base, right panel and top-left lightened, MJ NotSteered #09 default face placed, cut by top edge).
- B: kneaded-eraser lift over the face (box 570,0,805,190 canvas px, strength 0.78, 8 passes). Leaves a ghost in the tooth.
- C: continue from B with planC (no head op). 207 strokes, likeness gain 0.03. No visible second head: the plan did not contain one. Kept as a record.
- C2: continue from B with planC2 (same face crop placed at base box 770,40,990,280; outside that box the target is B). Restraint 0.6, cap 700, seed 21: stopped at 364 strokes.

Observations on C2:
- The ghost head and the displaced second head read as one head that moved (two-time structure).
- The second head resolved to a near-finished face in 364 strokes; the brief asked for "unfinished".
- Both heads are the same MJ default face (centred, frontal, findable), so the default is now present twice.

## C3: second head as a block-in
- compose `place` gained `blur` and `values` (squint to N values). planC3 = planC2 with blur 7, values 3.
- 350 strokes from B. The second head is hair mass, eye sockets and a nose shadow, no features.
- The taken-back head is now more resolved than the present one.

## Critic round on C3 (the paint simulator critic/read.py; packet in critic/)
- canon: VCLI-G 3.31, SCI 2.67, route OMEGA; quiet share 0.48; black share 0.000 (no committed black); 0 controlled anomalies.
- Reading turned into three intentions (intentD.json):
  1. lose-left-cut (soften-edge, x=44, y 115-545): the mass ends in a straight vertical cut.
  2. one-black (connect-mass along the finger-shadow ridge): no committed black anywhere.
  3. neck (connect-mass from head block to shoulder dark): the blocked-in head floats.

## D: first intention pass (hand/intend.mjs, kernels v1)
- lose-left-cut: loss 0.0327 -> 0.0323, 3 actions, then 24 candidates rejected as "new light pocket". The edge is low in contrast already (ink 0 -> 0.4); what reads as a cut is its straightness. The soften-edge kernel measures contrast, not shape: this note has no matching kernel yet.
- one-black and neck: kernels satisfied by hard dark stripes (the neck read as a cord). Same failure Codex recorded: a corridor proxy rewards a line.

## D2: after the connect-mass fix
- connect-mass now probes 5 points across the corridor, proposes the hand's broad mark nearest the width or its densest hatch, offsets marks across the corridor, and has a softness guard (no new step across the corridor above maxAddedStep).
- one-black: loss 0.1045 -> 0.0050, 30 actions: a soft black mass in the finger shadow.
- neck: loss 0.1051 -> 0.0560, 2 actions, then no admissible action: a faint grey band. The softness guard stopped it.
- Replay exact for D and D2. Tests: tests/test_intend.mjs (all pass).

## Comparison (compare.png)
Sheets 1-3 (easel, LLM-written strokes), Codex u03 (Hands, 5539 commands), sheet 4 D2.

## break-edge kernel (E, E2, E3, E4 from D2)
- New kernel: boundary located per station (cross profile, smoothed along the edge), wander = mean distance of the smoothed boundary from its best straight line. Loss ((minWander - wander)/minWander)^2. Push / pull actions; maxShift guard.
- E (minWander 4): loss to 0 in 8 actions, visually almost unchanged: 4 px of wander is measurable and does not read.
- E2 (minWander 10, broad flat push): wander reads, but pushes were ribbed "caterpillar" bands.
- E3 (push = cluster of mid-width vocabulary strokes): texture right, but dotted and too dark. Cause: proposal paths were spaced wider than the stamp step (Hands' tracer samples ~0.4 w apart). Fixed with dense().
- E4 (dense paths, push pressure scaled to the tone of the mass): bumps extend the mass in its own texture and tone; loss 0.6503 -> 0.0460, 35 actions. Kept.

## propose.py: critic -> job, tested against the hand-written job on C3 (jobP.json, jobP.png)
Rules: no committed black -> deepen darkest passage; straight boundary >= 150 px -> break-edge; floating mass 15-120 px from main -> connect-mass.
- Hough line detection found no ruled edge (texture breaks it at pixel scale); replaced with side scans of the smoothed mass mask.
- Against the hand-written job: left ruled edge found at the same place (x 42-43); a second ruled edge found (shoulder patch, right side) that the hand-written job did not name; the black rule fired on a different dark passage (under the upper hand, the darkest by smoothed ink) than the hand-written one (finger shadow); the neck was not proposed as such (the nearest gap between the head group and the main mass is elsewhere, at the hair, 23 px); a join across the bottom-left was proposed that would close the reserved white of the knee.
- P (ran jobP): the bottom-left join laid a ribbed bar (hatch mark dragged along a path). P2: hatches laid as patches at the hand's slant. P3: added a cluster option for connect-mass; the broad mark still wins most joins (3 of 4 at bottom-left); the bar is lighter and narrower but is still a band.

## Round trip with ChatGPT (gpt/)
- gpt1.png: Russell's ChatGPT refinement. Prompt (verbatim): "Refine this image with the VTL style, keeping overall look and feel, but seeking additional consistency in mark making, enhance mood and add loose mark making. You can invent."
- H1.png: Hands (kollwitz-charcoal, restraint 0.5, seed 7) redraws gpt1 as its target. gpt_vs_H1.png side by side.
- Critic (both): route OMEGA.
- black_area: C3 0.0004 -> gpt1 0.0142 -> H1 0.0019. hard edges of all edges: 0.169 -> 0.386 -> 0.372.
- In gpt1 the blocked-in second head became a dog.
