Frog on a lily pad, again: the agent's report
Round 3: the round-2 brief re-run by a fresh agent against the tool as fixed after round 2, with three additions to the brief: use at least one of the new features, ship a GLB, and verify it by a viewer screenshot and a re-import round trip. The agent was forbidden to read the earlier attempt. Seven model renders plus six four-line probe renders.
What follows is the agent's report, verbatim. The "fixed" notes in the index (dogfood/README.md) say what changed in the tool because of it. frog_reimport_probe.aix is the round-trip program.
1. The model
A cartoon frog, 4.4 × 2.77 × 4.4 units (frog itself 2.7 tall, pad 0.2), facing +z on a notched lily pad. Torso and head are two ellipsoids in union(k=0.35) with displace(0.02, 0.18) and a low-contrast speckle skin; a cream belly, a smile, and two nostrils are decals; the eyes are two white spheres with decal pupils; four legs are three-point tubes (hip–knee–ankle, so the back legs fold) with a def foot() of a flat ellipsoid, three toe capsules and an extruded web polygon; the pad is a cylinder minus a rotated wedge, with nine radial veins as a ring of thin boxes applied as a decal. It matches the plan closely; the only compromise was thickening the pad from 0.12 to 0.2 (see friction). New features used: decal (pupils, mouth, belly, nostrils, veins), curve (mouth path, into tube, into decal), set light_azimuth/set light_elevation, and --focus eyes --beauty. All did what the docs said: decals added no geometry (the re-import confirms it), the curve tube was smooth, the focus render re-extracted at cell 0.018 and framed the eyes.
2. Friction log
- Thin flat base silently clipped from the mesh (the big one). Lines 17/19 (original:
pad_disc = cylinder(2.2, 0.12, round=0.04) | move(0, 0.06, 0)), line 61model = frog + pad. Expected: a 4.4-wide disc, ascheckprinted (model 4.4 × 2.69 × 4.4) and as step 3 insteps.pngshowed. What happened: sheet title said3.61 × 2.69 × 3.28, the top view showed the pad clipped to a rounded square, reportSurface extent x -1.807..1.806, no warning. Reproduced with 4 lines (cylinder(2.2, 0.12) + sphere(1)|move(0,1,0)→ extent ±1.366);--grid 200does not help (±1.33); a 0.3-thick disc is complete; adding asphere(0.1)at the rim "rescues" the whole disc. So a coarse pre-pass that sizes the extraction domain misses a plate thinner than its spacing lying at y = 0 and independent of--grid. Workaround: pad 0.2 thick. Nothing in the docs mentions this; it is a wrong-size thatcheckcannot see and the sheet reports without comment. - Feet floated above the pad and the "separate pieces" warning was misattributed. Line 61 originally
(frog | move(0, 0.12, 0)) + pad: feet bottom at 0.10–0.13 plus 0.12 landed at 0.22 over a pad top of 0.12. The warning said the loose piece (vol 0.546 at (-0.2, 0.078, 0.41)) was in'mass', 'skinned'; it was the pad (or the whole frog vs pad), and neitherpadnorlegswas named. Workaround:frog | ground() | move(0, pad_thick - 0.01, 0). The probe version attributed correctly ('pad_disc', 'model'), so the attribution is unreliable with blended/decalled steps whose loose bounds contain the point. - Spurious thin-part warning on a decal region. Line 20
vein = box(2.0, 0.3, 0.035):checkwarned "'vein' is only 0.035 units thin ... may be missing or broken in the mesh ... set grid 315".veinis only ever adecalregion (line 22) and adds no geometry; the warning is wrong and its advice (grid 315) would cost 15× the samples. I widened it to 0.05 to silence it. - Watertight warning names decal regions and blend inputs. Report: "37 edges ... in 'belly_region', 'torso', 'head'".
belly_regionis not geometry (line 29–30), andtorso/headwere blended intomass. The location is right (the belly/skin boundary), the step names are not helpful. - Slices draw a decal region as a filled interior solid.
slices.pngX=0 shows the belly (line 29 region) as a tan blob inside the green body, as if the belly were a separate solid inside the frog. The doc says "filled means solid"; here the fill colour distinguishes materials by whichever region contains the point, so a decal reads as an internal part. I could interpret it only because I wrote it. - Z=0 slice shows two unexplained black dots above the head: the eye spheres (centre z 0.45, r 0.45) graze z = 0 and appear as black dots rather than white; nothing on the sheet says they are tangencies.
- Speckle at 0.07 units looked like camouflage blocks on the sheet. Line 9 originally
scale=0.07with cell 0.034: the sheet colours per vertex, so a pattern near the cell size becomes a blotchy mosaic; the beauty render was fine. The docs warn about patterns larger than the part, not smaller than a cell. Fixed with scale 0.11 and closer colours. - Pad veins are jagged on the sheet, clean in beauty (lines 20–22): same per-vertex colouring; a 0.05-wide decal is a stair-step on the sheet. Not documented that sheet materials are vertex-sampled.
- Focus render clips decal regions into dark blobs.
--focus eyessheet shows the mouth decal as dark patches at the clip frame's bottom corners (the clip box cuts through the region). Interpretable, but it looks like a defect until you know the frame is a clip. - Beauty framing is loose. At
--beauty-size 768the model fills ~45% of the frame; no documented way to zoom the beauty camera (only azimuth/elevation), short of--focus. checkdoes not listdefbodies (toe,foot, lines 46–50), so adef's sizes are only visible once called and named;foot()had to be judged inback_foot's thumbnail.- Import is slow:
import("../out/frog/model.glb")took 18.3 s to sample 115 k triangles at cell 0.046 on bothcheckandrender(it is not cached between the two), longer than meshing the original from scratch (2.2 s). ground()afterunion(k=)leaves the bounds at y −0.01 (line 61:model ... y -0.01..2.76) while the surface is at 0: expected from the docs, but it means everycheckline for the model looks a hair below the floor.- Viewer could not be verified (see 3); the page shows no message when three.js fails to load, just a blank canvas under a correct header.
3. Export verification
- Viewer screenshot:
frog_viewer.pngshows the page header rendered correctly ("model 4.40 × 2.77 × 4.40 units · 115400 triangles", Perspective/Front/Right/Top/Wireframe/Grid buttons) over a blank grey canvas.shot.mjsreportedwebgl: true, errors: []after 8 s; one retry with a 30 s wait and full console capture gavenet::ERR_CONNECTION_RESETandTypeError: Failed to fetch dynamically imported module: https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js.curlreaches that URL (HTTP 200 through the proxy), so it is the headless browser's path to the CDN in this sandbox, not the page. Not pursued further, per the brief. - GLB round trip:
model.glbis 3.69 MB with a 1024 px atlas (model.png, 610 charts). Original: 4.4 × 2.765 × 4.4, 115,400 triangles, volume 9.139. Re-import (frog_reimport.aix): 4.401 × 2.761 × 4.401, 111,368 triangles, volume 9.127, surface extent identical (±2.2, y −0.001..2.76), one piece, no warnings. The re-import sheet is the same frog in untextured clay: pad, notch, eyes, folded legs, toes and web all present; skin slightly smoother (sampled at cell 0.046); all decals gone (belly, mouth, nostrils, pupils, veins), as expected for a geometry-only import.
4. What worked well
check in ~1 s with every step's box; the sheet/slices/steps trio (the steps sheet let me see pad intact and thereby pin the clipping to the final extraction); decal for every facial feature with no geometry cost; curve + tube as a decal region for the mouth; tube through three points for folded legs; mirror for symmetry; def for the foot; union(k=) + displace for a soft body; --focus ... --beauty and --out for a close-up without clobbering the main render; the beauty render's shading and shadows made the character presentable in three iterations; --no-export --no-viewer for fast diagnostic renders.
5. Three changes that would have helped most
- Fix or warn on the domain-sizing pre-pass: the extraction domain must never be smaller than the output's bounds when the field is negative there; at minimum, warn when "Surface extent" is smaller than a primitive's exact bounds ("'pad_disc' reaches x ±2.2 but the mesh stops at ±1.81").
checksaid 4.4 and the sheet said 3.61 with no comment. - Treat decal regions as regions: no thin-part warning, no watertight/loose-piece attribution to them, and draw them in slices as a surface-only colour rather than a filled interior solid (or mark region-only steps on
steps.png). - Document sheet-versus-beauty material sampling and a beauty zoom: say that the sheet colours per vertex so patterns and decals near a cell look blocky while the beauty render and atlas are exact; and give the beauty camera a framing/zoom setting (
set zoomor a fill percentage) so the presentation image is not half empty.