STAR-CCM+ 21.02 · macro-writer skill
gevouwenrun-geverifieerdwacht op akkoord

Recept-idiomen in de skill gevouwen Recipe idioms folded into the skill

2026-07-18 · vijf volgorde- en type-vallen die pas opduiken als de objecten samenwerken 2026-07-18 · five ordering & type traps that only surface once the objects interact

De macro-schrijf-skill leerde al de losse symbool-vervangingen (welk 21.02-classnaam de oude 19.x-naam vervangt). Maar een symbool kan afzonderlijk klóppen en tóch falen door de volgorde of het type. Deze vijf zijn gevangen tijdens het bouwen van één volledige macro — blok → regio → rand → mesh → celtelling → continuüm → stopcriterium — die schoon herdraait op deze host: INTEGRATED OK: boundary=Velocity Inlet cells=30 maxSteps=250. Dat is het sterkste bewijs: een échte run op de machine, geen boek-citaat. The macro-writing skill already taught the individual symbol swaps (which 21.02 class name replaces the old 19.x one). But a symbol can be individually correct and still fail because of order or type. These five were caught building one full macro — block → region → boundary → mesh → cell-count → continuum → stopping criterion — that re-runs clean on this host: INTEGRATED OK: boundary=Velocity Inlet cells=30 maxSteps=250. That is the strongest evidence tier: a real on-host run, not a corpus cite.

De vijf vallenThe five traps

1 · Een leeg blokA degenerate block

createNewBlockPart(...) op zich maakt een ontaard blok — nul part-surfaces, dus niet te regionen of te meshen. Roep setCorners(min,max) aan om een echt doosje met een oppervlak te krijgen. (Het geeft een SimpleBlockPart terug; setCorners en de corpus-vorm getCorner1()/getCorner2()...rebuildSimpleShapePart() zijn twee maat-methodes op dezelfde class — geen ander part-type.) createNewBlockPart(...) alone makes a degenerate block — zero part surfaces, so it cannot be regioned or meshed. Call setCorners(min,max) to get a real box with a surface. (It returns a SimpleBlockPart; setCorners and the corpus form getCorner1()/getCorner2()...rebuildSimpleShapePart() are two sizing methods on the same class — not a different part type.)

2 · Geen oppervlak → geen randNo surface → no boundary

Een regio uit een oppervlak-loos blok heeft nul randen. "OneBoundaryPerPartSurface" heeft echte oppervlakken nodig; mét setCorners krijgt het blok één part-surface → de regio krijgt één rand → setBoundaryType werkt. A region built from a surface-less block has zero boundaries. "OneBoundaryPerPartSurface" needs real surfaces; with setCorners the block has one part surface → the region gets one boundary → setBoundaryType works.

3 · Volume-mesher wil eerst een regioVolume mesher needs a region first

Een volume-mesher (bv. DualAutoMesher) eist dat het part al aan een regio is toegewezen — anders: "Parts need to be assigned to a Region because Volume Mesher is present". Bouw de regio vóór de mesh-operatie. Een oppervlakte-only op (ResurfacerAutoMesher alleen) heeft geen regio nodig. A volume mesher (e.g. DualAutoMesher) requires the part already assigned to a region — else: "Parts need to be assigned to a Region because Volume Mesher is present". Build the region before the mesh operation. A surface-only op (ResurfacerAutoMesher alone) needs no region.

4 · "Maximum Steps" bestaat pas ná het continuüm"Maximum Steps" exists only after the continuum

Het stopcriterium "Maximum Steps" bestaat alleen zodra een fysica-continuüm aan de regio is toegewezen. Op een leeg sim faalt getSolverStoppingCriterion("Maximum Steps") met "does not exist in manager". Doe eerst r.setPhysicsContinuum(pc), dán de opzoeking. The "Maximum Steps" stopping criterion exists only once a physics continuum is assigned to the region. On a blank sim, getSolverStoppingCriterion("Maximum Steps") fails with "does not exist in manager". Do r.setPhysicsContinuum(pc) first, then the lookup.

5 · getCellCount() geeft een longgetCellCount() returns a long

int cells = ...getCellCount() is een "possible lossy conversion from long to int" compile-fout — maar de .bat geeft alsnog exit 0, dus een naïeve "exit 0 = geslaagd"-scorer meldt een vals succes. Bewaar het in een long. int cells = ...getCellCount() is a "possible lossy conversion from long to int" compile error — yet the .bat still exits 0, so a naive "exit 0 = pass" scorer reports a false success. Store it in a long.

Imports:Imports: star.common.* · star.meshing.* · star.base.neo.* · star.metrics.* · star.material.* · star.segregatedflow.* · star.flow.* — let op: BaseSize zit in star.meshing (niet star.common), en FvRepresentation/StepStoppingCriterion/InletBoundary in star.common. — note: BaseSize is in star.meshing (not star.common), and FvRepresentation/StepStoppingCriterion/InletBoundary are in star.common.

Maker ≠ controleur — wat de onafhankelijke check vingCreator ≠ validator — what the independent check caught

Ik (maker) heb gevouwen; een onafhankelijke reviewer-agent controleerde elk symbool tegen het echte .java-artefact, de les, de corpus-tutorials en de javadoc. Verdict: 1 echte fout — mijn tussenzin bij val 1 had een niet-bestaande Block-class verzonnen en een valse "ander part-type"-splitsing. Grondwaarheid: createNewBlockPart geeft een SimpleBlockPart, één class. Gecorrigeerd. Precies de hallucinatie-soort die deze skill hoort te voorkómen — de maker-≠-controleur-regel verdiende zijn plek. I (creator) folded; an independent reviewer agent checked every symbol against the real .java artifact, the lesson, the corpus tutorials, and the javadoc. Verdict: 1 real defect — my parenthetical on trap 1 had invented a nonexistent Block class and a false "different part type" split. Ground truth: createNewBlockPart returns a SimpleBlockPart, one class. Fixed. Exactly the hallucination class this skill exists to prevent — the creator-≠-validator gate earned its keep.

Bonus: doorvalideren ving een tweede hallucinatieBonus: deeper validation caught a second hallucination

Omdat de reviewer één verzonnen class had gevangen, vertrouwde ik de rest niet blind. Ik heb elke class-naam in de hele skill (~69 stuks) tegen de 21.02-javadoc gegrept. Resultaat: de nabuur-sectie van 2026-07-17 noemde RealizableKEpsilonTwoLayer voor de k-ε Realizable two-layer — die class bestaat niet in 21.02. De echte is RkeTwoLayerTurbModel (star.keturb), corpus- én javadoc-bevestigd. De fout kwam uit de bronles van 2026-06-04 en was zo mee-gevouwen. Gecorrigeerd in skill én bronles. De overige 68 classes bestaan allemaal. Les: check class-namen tegen de corpus/javadoc, niet alleen tegen de bronles — een bronles kan zelf een verzonnen naam dragen. Because the reviewer had caught one invented class, I didn't trust the rest blindly. I grepped every class name in the whole skill (~69) against the 21.02 javadoc. Result: the neighbouring 2026-07-17 section named RealizableKEpsilonTwoLayer for the k-ε Realizable two-layer — that class does not exist in 21.02. The real one is RkeTwoLayerTurbModel (star.keturb), corpus- and javadoc-confirmed. The error came from the 2026-06-04 source lesson and had been folded in with it. Fixed in both skill and source lesson. The other 68 classes all exist. Lesson: check class names against the corpus/javadoc, not only the source lesson — a source lesson can itself carry a hallucinated name.

Status: additief + omkeerbaar (sectie verwijderen = terugdraaien). Reviewer schoon ná de fixes; hele-skill class-audit schoon (68/69, de ene fout gecorrigeerd). Wacht op jouw task_clock.py accept — "klaar" verklaar ik hier niet zelf. Status: additive + reversible (delete the section to revert). Reviewer clean after the fixes; whole-skill class audit clean (68/69, the one error corrected). Waiting on your task_clock.py accept — "done" is not mine to declare here.
Bronnen: star_ccm_resources/macro_write_skill_2102.md (nieuwe sectie) · les lessons_learned/2026-07-18_full_case_template_recipe_idioms_run_verified.md · artefact agent_eval/_gap_validation/full_case_template_2102.java · auditnotitie lessons_learned/_skill_additions_2026-07-18_review.md Sources: star_ccm_resources/macro_write_skill_2102.md (new section) · lesson lessons_learned/2026-07-18_full_case_template_recipe_idioms_run_verified.md · artifact agent_eval/_gap_validation/full_case_template_2102.java · audit note lessons_learned/_skill_additions_2026-07-18_review.md