# Grouper Tender: status Working name "Grouper". The user's blueprint: `reference/user_blueprint.jpg` ("DEEP SEA EXPLORER - SUBTUB CLASS", DS-ST-001), *"create me 3d model of this tender from this blueprint exactly"*; then the concept render `reference/user_concept.jpg` (*"Check this picture as a referance"*). Blueprint rules shape; concept rules the look. ## Done - 2026-10-22, Designer: zooms with rulers (`build/gr_zoom.py` -> `reference/z4_*.png`, concept zooms `z_concept_c_*.png`); silhouettes and drawn lines of every view (`build/gr_trace.py`, `gr_views.py` -> `reference/mask_*.png`, `lines_*.png`, `build/outline_tables.json`); every number in `build/gr_measure.py` (scale 0.0171 m/px, origin, clamp axis, hull loft tables, every part, cabin, moving parts, materials, the concept's strips, traces and lamps); check pictures `reference/trace_*.png` (`build/gr_tracecheck.py`); the design `design/DESIGN.md`. - 02:43-03:01 two copies of the Designer wrote here (the Administrator's mistake); reconciled at 03:05-03:20: one set of scripts (gr_masks.py removed, gr_views.py kept), masks and tables regenerated, `gr_measure.py` revised for the concept. ## Rebuild the readings `python build/gr_views.py && python build/gr_sil_tables.py && python build/gr_tracecheck.py` (Python 3.14, PIL, numpy). ## Next - Coder: build headless from `design/DESIGN.md` and `build/gr_measure.py` (the Mako's and Spearfish's pipeline copied into `build/` with a `gr_` prefix): hull loft, parts, collar as the Kazah clip, cabin, rig, checks (moon pool, carousel, clamp with the antenna raised and folded, motion, view), surfaces, UCX, FBX, side-by-side against the sheet and the concept. - Not measured yet: moon pool and carousel (the Coder's checks). ## Coder, 2026-10-22: geometry, rig, collision (done) `Tender_Grouper.blend`, built headless in 4 s: `blender -b --factory-startup --python build/run_build_headless.py` (rebuild on the saved file: `blender -b Tender_Grouper.blend --python build/run_build_headless.py`). 7.45 x 2.70 m, keel z -1.73 to the collar's lip 1.375 (antenna tip 1.83); origin 9 cm behind the clamp axis (0, -0.09). - Objects: `SM_Grouper_Hull` (skin, collar, trims, every static fitting; 83.7k tris, quads + 2 tris), `SM_Grouper_Glass` (2.1k), `SM_Grouper_Cabin` (11.9k), moving: `SM_Grouper_Hatch`, `SM_Grouper_Door_L` / `_R`, `SM_Grouper_Rotor`, `SM_Grouper_Antenna` (origins on their axes). 0 n-gons, 0 zero-area faces. 12 sockets (SOCKET_Clamp, _Seat_L/R_Eye, ...). - Rig on `Grouper_Root` (simple expressions, all valid): `hatch_open_deg` 0-100, `door_l_deg` / `door_r_deg` 0-95, `rotor_turns`, `antenna_fold_deg` 0-70 (fold it for docking), `lights` (for the surfaces pass). - Collision: 29 convex `UCX_SM_Grouper_Hull_NN` (2.8k tris, convex within 0.5 mm), "GROUPER | Collision (UCX)" hidden. - Materials (flat looks, names for the surfaces pass): M_Grouper_Gunmetal, _Band, _FrameDark, _Acrylic, _Strip (groove floors, the collar's ring, the duct's ring), _LampWhite, _ScannerLens, _DuctGlow, _Recess, _Steel, cabin _Cabin, _CabinFloor, _Seat, _Screen, _CabinDark (M_Grouper_Trace and _Marking exist, unused: traces and markings are texture work). Seam fields on the hull vertices: `seam_chine`, `seam_belly`. No UVs yet (surfaces pass). - Checks (`sh build/run_checks.sh`, results `build/checks/*.json`): motion 0 hits (hatch 4.7 mm, doors 3.1 mm, antenna 6 mm, rotor 4.9 mm least gaps); view: both eyes straight ahead through the front glass, 51 % of the cone through glass; cabin 0 crossings, 0 within 5 mm (least 11.8 mm); arm head (the Tiger's 20-pose dump): 0 hits, claws 5 mm from the lip, hatch 30 mm, antenna 80 mm raised / 319 mm folded; clash audit: 113 part-to-part contacts, intended joints; folds: 26 quads > 90 deg left (10 at each pod's nose tip, 14 inside the front glass trim's lower corners, 2 at the stern). - Previews: `previews/wb_*.png`, `previews/topo_*.png`, `previews/compare/sheet_side|top|front|back.png`. - Tools: `gr_preview.py`, `gr_compare_sheet.py`, `gr_section.py` + `gr_section_plot.py` (true sections), `gr_shot.py`, `gr_fold_audit.py`, `gr_clash_audit.py`, `gr_dump.py`. ## Next - Surfaces pass (UVs, baked masks, the strips' and traces' emissive masks, markings "Subtub 1", insignia, seal), the concept camera fit and `previews/compare/concept_pair.png`, ship checks (moon pool, carousel, 86-pose clamp in the arm and ship files, BOARD-to-POOL), FBX + layout JSON, studio renders. - Known: the junction ahead of the door where the band's front, the frame's corner, the pod's nose and the cheek meet (x 836-850) has wavy column flow and the 10 folded quads; the pods' tail cones bend in toward the hull (BACK draws them concentric) so they never hang free. ## Coder, 2026-10-22 (finishing step): fit checks against the ship and the arm (done) All at the current scale (S 0.0171, unchanged), results in `build/checks/`: - `gr_dump_tris.py` -> `grouper_tris.npz` / `grouper_points.npy` (docked: antenna folded 70 deg) and `_raised` (as drawn). - `gr_sweep_check.py` (ship file, read-only): moon pool at BOARD **1.455 m** to the deck well's lip (limit 1 m; Kazah 1.206); carousel table: side 0.834 m, roof 1.218 m (antenna raised: 0.783 m). `sweep_and_moonpool.json`. - `gr_carousel_bvh.py`: 360 placements, 0 crossings, no ship face within 0.6 m (both antenna poses). `carousel_bvh*.json`. - `gr_clamp_check.py`: arm file 86 poses 0 intersections, least gap 5 mm (claws to the collar's lip r 0.552); ship file 3 Tender places 0 intersections, 5 mm. Raised antenna: 73 mm from the ore hose (folded: 465 mm). `clamp_*.json`. - `gr_descent_check.py`: BOARD to POOL 9 steps, 0 crossings, least ship gap 1.337 m, arm 7.3 mm (claws). `descent.json`. ## Coder, 2026-10-22 (finishing step): surfaces, export, pictures, comparison sheets (done) - **Geometry added** (rebuild, `gr_doors.py`, `gr_clamp.py`): a door stop ring inside each doorway's sleeve 8 mm behind the leaf and a seat ring under the hatch's rim, so no line of sight runs through the 8 mm door gaps or the 6.7 mm hatch gap into the cabin (the side render saw through both doors; the cabin check now finds 0 cabin vertices visible from outside, was 8). Motion unchanged (0 hits), clash audit: intended joints only. Hull 86,148 tris. - **Surfaces** (`gr_decals_draw.py` then `gr_surfaces.py`, about 2.5 min): UVMap atlas (exterior 4096, cabin 2048) + UV_Tile; baked Masks / BevelNormal and the exterior **Emissive** map (strips, traces, duct glow, lamps, scanner cells); the concept's materials on the user's pack sets; mesh decals `SM_Grouper_Decals` ("Subtub 1", generic striped insignia, generic seal with a cyan circuit emblem, UI panels, the small stern insignia); 9 light drivers (`lights * k`, simple, valid). - **Export** (`gr_export.py`): `fbx/SM_Grouper_*.fbx` (10 files incl. `Grouper_Assembled.fbx`, hull with 29 UCX), checked by re-import (movers at their pivots); `Grouper_layout.json`. - **Pictures** (`gr_render.py -- v01 128 studio water concept lookalike`, `gr_preview.py -- wire tag=v01`, `gr_pairs.py`): `previews/v01_studio_*` (8), `v01_water_nose|stern`, `v01_topo_*` (8), `compare/concept_pair.png` (camera fitted by `gr_concept_fit.py`, 35.8 mm, rms 9.0 px main landmarks), `compare/lookalike.png`, `compare/cmp_.png` (IoU SIDE 0.938, TOP 0.948, FRONT 0.959, BACK 0.951, BOTTOM 0.864), `compare/side_inkover.png`. - `README.md`, `build/run_all.sh`, `build/run_checks.sh` (full chain). ## Next (open) - Topology: 26 folded quads (pod nose tips, front glass trim corners, stern), the wavy junction at SIDE x 836-850; the pods' tail cones bend in (BACK draws them concentric). No LODs; hull 86k tris; hull atlas fill 38 %. - The user's word on the look and the additions; Unreal import. ## Critique, round 1 (2026-10-22): verdict FIX `critique/round1.md` (pictures and scripts in `critique/round1/`; nothing in the model, scripts or .blend changed). Outline 88 % (IoU SIDE 0.935, 0.976 without the drum-mount box; TOP 0.945, FRONT 0.959, BACK 0.951), look 62 %. Seven MAJOR items: 1 the drum's mount is a wire cage, not the concept's solid bracket + bent tube (SIDE loses 0.75 m2 at x 845-925); 2 topology: dense 161 x 144 grid, 86k tris, wavy cheek flow, 26 folded quads, no LODs; 3 BACK: pods' tail cones are lumps, not ringed cones; 4 circuit traces are broken pixel dashes (draw them as vector lines); 5 light strips 3-5x too wide (concept 2-3 px vs model 8-14 px from the same camera); 6 windows dark, the concept's are full of lit cyan screens; 7 SECTION A-A seats are boxes. Twelve MINOR items (gloss, blotchy frames, porthole see-through, lamp beside the drum, drum ribs, stepped duct, collar pockets' finish, BACK plate, door latches/hinges, hidden faces, texel density, scale note to the user). ## Coder, critique round 1 (2026-10-22, in progress) Backup of the state before this round: `versions/v01_before_critique_r1/` (.blend, build/, fbx/, textures/, layout JSON, previews/compare/, README, STATUS; 101 MB). Done so far (geometry, built headless, `sh build/gr_quick.sh TAG` = build + fold audit + wireframes `previews/TAG_topo_*`): - M2 re-loft: 72 columns (was 144), 103 stations (was 161); free columns smoothed along the hull (`smoothed_arcs`), station pairs kept consistent; groove walls 8 mm, the frame band's front end and lower edge 30 mm chamfers; folds 0 (was 26). Hull 46.8k tris (was 86.1k; the skin grid 15.6k, was 49k). Hidden faces pruned (fittings >15 mm under the actual skin, grid faces inside the pod pieces and under the collar). - M3: the pod is a straight nacelle (axis +-1.017, z -1.382); its nose and its tail cone are revolves (`gr_fittings.py`); the tail steps in at BACK's rings r 15/11/8 px, end cap r 5 px; the grid's lobe sinks only inside those pieces. - M1: solid bracket block 0.30 m wide under the nose (bolts), the bent tubes as drawn (8x zoom), sled rails, hangers. - m5 drum grooves, m6 stepped duct (slot follows the shroud now), m7 pocket chamfers (8 deg) dark, rim r 0.553, m8 slim skeg root, m9 oval latches and flush hinges (axis 4 mm out), m3 smoked porthole acrylic (M_Grouper_AcrylicDark). - M7 bucket seats, console column with the two-pad control box; M6 screen banks (dashboard 3 per pilot + middle, under the side windows), overhead screens twice the area, ceiling glow strips (M_Grouper_CabinGlow). - TOP's pod vents and raised capsule built (the README said they existed; they did not). - Checks so far: motion 0 hits (doors 3 mm, hatch 4.1 mm, antenna 6 mm, rotor 4.9 mm); view 52.3 % through glass; cabin 0 crossings, least 15 mm, 0 seen from outside. Next: surfaces (strips as thin lines, vector traces, satin gunmetal, frames' set, screens cyan), LODs + export, ship checks, renders and comparison sheets, README. - (later the same session) Surfaces redone: the hull alone on the 4096 Exterior atlas, its skin one arc-length island written by the build (UV_Grid, v per station: no folds), 300 px/m (was 239); doors, hatch, glass, rotor, antenna on a new 2048 "Parts" atlas (M_Grouper_Part* copies); strips = a 28 mm line in each groove floor (strip_v/strip_w vertex fields), strength 3; traces = vector polylines (`gr_decals_draw.py` TRACES), 10 mm lines, 20 mm dots; satin gunmetal (coat 0.06 at 0.32); the frames' StainedSteel tiled 0.30 with its contrast flattened; screens on a lit cyan ground, no amber, strength 5; cabin glow 3; porthole smoked; decal sheet 2048 x 2048 (pad 0.26 m: the coarser hull faces). Bake margin 2 px, pack margin 4.5 px. - m4: a lamp beside the drum (first on the cradle's side frame; moved to the drum face's lower rim, r 0.505, 26 deg below the side, because from the concept camera the drum hid it); landmark SOCKET_DrumLamp_L fits within 6.3 px. - Export with LODs (`gr_export.py`): hull 47.4k / LOD1 23.7k / LOD2 9.5k; glass, doors, hatch, rotor too. - `run_all.sh` now always builds a new file; `gr_fold_audit.py` writes `checks/folds.json` (over 20/25/90 deg, skin alone). ## Coder, critique round 1: DONE (2026-10-22) Final pipeline `sh build/run_all.sh r1 128` + `build/gr_lods_preview.py`, all on a new file. Every item of `critique/round1.md` worked; README.md has the round's table ("Round 1") and the current numbers. - Checks: moon pool 1.457 m; carousel side 0.836 / roof 1.21 m (raised 0.789), triangle sweep 0 crossings; clamp 86 poses + 3 ship places 0 hits, least 5 mm; BOARD to POOL 0 crossings (ship 1.301 m, arm 7.2 mm); motion 0 hits (hatch 4.1, doors 3.0, antenna 6, rotor 4.9 mm); cabin 0 crossings, least 9.1 mm, 0 seen from outside; view 52.3 % through glass; drivers simple. - Mesh: hull 47,322 triangles, quads only (was 86,148), folds 0 (was 26), quads over 25 deg 254 (was 432), over 20 deg 349; no slivers; LOD1 23,661 / LOD2 9,450. Exterior about 55k (the critique's target was about 35k: not met). - IoU: SIDE 0.942, TOP 0.950, FRONT 0.954, BACK 0.953, BOTTOM 0.868. Concept camera rms 9.0 px main landmarks, 16.2 all. - UV: hull 304 px/m (4096, alone), doors 510, hatch 586 (Parts 2048), cabin 246. - Current pictures: `previews/r1_*`, `previews/lods_hull.png`, `previews/compare/*` (concept_pair, lookalike, cmp_*, side_inkover, lk_*). `previews/v01_*`, `wb_*`, `topo_*` are the first delivery's (stale). ## Next (open) - Twists over 20 deg (349) are not under the critique's limit; the exterior is about 55k triangles, not about 35k. - The front window reads darker than the side window from the concept's camera (its screens face the pilots). - The scale note for the user: the sheet's largest label says 15,500 mm; the model is 7.45 m (the collar sets the scale). - The Critique's round 2; the user's word; Unreal import. ## Critique, round 2 (2026-10-22): verdict FIX `critique/round2.md` (pictures, scripts, JSON in `critique/round2/`; nothing in the model, scripts or .blend changed; Blender headless read-only). Outline 89 % (IoU SIDE 0.939, 0.976 without the drum-mount box; TOP 0.947, FRONT 0.954, BACK 0.953, BOTTOM 0.866, 0.908 at best shift), look 75 %. Motion re-run by the Critique: 0 hits. Three MAJOR items: 1 (new) the claw pockets are torn: the skin's pruned opening under the collar (r up to 0.63) is open between the Kazah wall (r 0.535) and the skin in the pockets; the two aft pockets (45/135 deg) are see-through holes (336/337 rays reach the far flank and the cabin; `collar_rays.json`); the collar ring's edge is a sawtooth; 2 the drum mount is still a square-tube scaffold: the drawn bracket plate (top y 400 x 903-921, front x 921 to y 450, aft diagonal (903,401)-(888,440)) is open, SIDE misses 2,302 px in the mount box; 3 from the concept camera the front window is black (nothing lit where the sight lands: port seat front, port wall, rear bulkhead) and the screens clip to flat cyan (strength 5). Eight MINOR: flag/seal decals share 4 faces per side (bite in the flag), drum band at y -3.131 wound inward + window reveals seen from behind (Unreal see-through), 102 quads twisted > 45 deg (pod fillet, cheek), drum reads as a tyre, drum lamp a 3 cm stud, pod vents short and tile-like, two empty UI rectangles on the trace panel, stair-stepped light-line edges. Next: Coder, round 2 fixes; then re-run the ray tests (`critique/round2/cr2_holes.py`, `cr2_collar_rays.py`), clamp, moon pool. ## Coder, critique round 2 (2026-10-22, in progress) Backup of the state before this round: `versions/v02_before_critique_r2/` (.blend, build/, fbx/, textures/, layout JSON, previews/compare/, README, STATUS; 92 MB). Geometry done so far (built headless, new file each time): - M1 collar (`gr_clamp.py`, `gr_finish.py`): the skin is no longer pruned under the collar (its opening is the grid's clean r 0.512 ring); every collar section ends in one skirt at r 0.695 fitted to the faceted skin (+5.5, +1.2, -3 mm); the pockets have a floor plate from the Kazah wall (r 0.535, crisp corner) to the skirt; pockets sampled every 2.25 deg, chamfers 1 deg. Pocket rays (`build/gr_collar_rays.py`, copy of the Critique's): 1-2 grazing hits per pocket (was 336/337 aft). - M2 drum mount (`gr_fittings.py`): solid convex block 0.34 m wide (SIDE outline (876,397) (913.5,396) (916.3,401) (916.3,450) (906,450) (889,440.5)), bolts; two round stubs per side to hubs at (905,407) and the clevis (912,445); round bent tube (0.10 m) between them; cheek bracket plate + rails into the bend; hangers, square U tube, cross bars, flange clamps gone. SIDE IoU 0.957 (was 0.939; `build/gr_iou.py`, copy of the Critique's cr_iou.py). - m4 drum: straight body, 0.06 m edges, four raised rings 6 mm proud, 8 mm wide. m5 drum lamp: housing r 0.064, lens 10 cm, axis r 0.53 at -25 deg (concept camera ~8 px from (703,358)). m6 pod vents: recessed slots 769.7-797 and 808-830.2 (ends on the lip rings). m2: window flanges 0.16 m, lining fitted to trims without flanges, flanges not shortened at convex corners, pod lip rings capped (closed), porthole acrylic a slab, loft caps oriented by ray parity (seat fronts). Back-face rays (`build/gr_holes.py`): ~330 of 699k (was 1,874; drum 2, was 1,020). - m3: collar chamfer morph eased, window trims sampled at 6 deg; quads twisted > 45 deg split into triangles (94 quads -> 188 tris, the critique's fallback; the pod fillet grid itself was not re-pinned). Over 25 deg: 166 (was 254). - M3 cabin (`gr_cabin.py`): 4 bulkhead screens, wall screen panels between window and door and aft of the door (both sides), a 3-screen top row on the dashboard's front edge under z -0.07; view check unchanged (52.3 %). - Surfaces edits made, not yet run: screens peak 0.52 x 1.8, cabin glow 9, clear acrylic rough 0.02 (no dirt map), strip lines inset 3 mm from face edges with 5 mm soft edges, emissive bake at 2x + box filter; decals: separate lifts where markings overlap, quads split on the ridge diagonal; traces replace the two empty UI rectangles (m7). Next: full pipeline (`sh build/run_all.sh r2 128`), close-ups, all checks, README. - (later) Window flanges now follow the lining 16 mm on the cabin side (projected along the opening's normal), 0.16 m long (0.10 under the side windows, 0.05 on the front glass's lower half, never past the cabin's front end wall); the lining's opening is fitted to the trims with round 1's 5 cm flanges; each pane a closed 4 mm slab (`glass_slab`, a single refracting surface hid the cabin from the concept camera); ledge screens 8 cm lower. Cabin check 0 crossings, view 52.3 % both seats, back-face rays ~305. Full pipeline `sh build/run_all.sh r2 128` started (log `build/checks/run_all_r2.log`). ## Coder, critique round 2: DONE (2026-10-22) Final pipeline `sh build/run_all.sh r2 128` (7.5 min, a new file) + `build/gr_lods_preview.py`; every item of `critique/round2.md` worked; README.md has the round's table ("Round 2"), the checks table and the Open list. - Checks: moon pool 1.457 m; carousel side 0.836 / roof 1.204 m (raised 0.786), triangle sweep 0 crossings (both poses); clamp 86 poses + 3 ship places 0 hits, least 5 mm (hose 73 mm raised); BOARD to POOL 0 crossings (ship 1.248 m, arm 7.1 mm); motion 0 hits (hatch 4.1, doors 3.0, antenna 6, rotor 4.9 mm); cabin 0 crossings, least 2.1 mm (flanges under the lining), 0 seen from outside; view 52.3 % both seats; drivers simple and valid. - Round 2 tests: pocket rays 1/3/0/1 (were 336/337/4/8); see-through 315 of 699k rays (was 1,874; drum 2, was 1,020); decals 0 coincident, 0 quads (498 tris), 0 missing; quads > 45 deg 0 (105 split into 210 tris), > 25 deg 181, > 20 deg 286. - IoU SIDE 0.957 (was 0.939), TOP 0.948, FRONT 0.954, BACK 0.953, BOTTOM 0.867. Concept camera rms 9.3 px main, 16.3 all; the drum lamp 8.3 px. - Mesh: hull 52,168 tris (25,979 quads + 210 tris), glass 1,944 (slabs), cabin 10,914; LOD1 26,083 / LOD2 10,430. - Current pictures: `previews/r2_*` (studio, water, topo, cu close-ups incl. `r2_cu_pockets_4.png`), `previews/lods_hull.png`, `previews/compare/*` (concept_pair, lookalike, cmp_*, side_inkover, lk_*, iou_diff_*). `r1_*`, `v01_*`, `wip_*` are stale. - Not done: the pod fillet / cheek grid was not re-pinned (the split is the fallback); see README "Open". Next: the Critique's round 3 or the user's word.