Case Study 02 — PhysicsNeMo MGN

CS02 validates physics-lint against NVIDIA’s PhysicsNeMo MeshGraphNet (MGN) checkpoint for 2D cylinder vortex shedding. The substrate is incompressible Navier-Stokes on a mesh; the rule methodology exercised is PH-CON-001 (mass conservation), with PH-CON-002 and PH-CON-003 correctly emitting SKIP via the open-driven-dissipative substrate-class dispatch (D0-22 + D0-23 v9 — KE is neither strictly dissipative nor strictly conservative on a cylinder-wake flow that imports KE from inflow and dissipates in the wake).

Headline result. PH-CON-001 fires across 5 in-band trajectories sampled from the 23 in-band members (Strouhal in [0.16, 0.21]) of the Phase-2 pre-fire audit. The median MGN/GT mass-conservation gap is -0.36% of GT, range [-1.07%, +0.41%]; every per-trajectory gap sits inside the ~5.8% harness-FE-on-P1 discretization floor. The canonical trajectory-44 pair lands at 5.857% (GT) / 5.881% (MGN). All 7 D0-24 verdicts PASS.

What the result demonstrates and does NOT demonstrate. PASS verdicts for PH-CON-001 mean MGN is within the GT / harness-FE-on-P1 floor envelope on that trajectory; they are NOT a claim of physical incompressibility to 5%. PH-CON-001 at this discretization bounds MGN’s deviation from GT-equivalence rather than from physical incompressibility — distinguishing the two would require a tighter discretization (deferred to v1.x; see “What physics-lint did NOT catch §1” below for the floor-bounds-resolution distinction). The result is a small-N statistical characterization across the in-band subset, not a full-distribution claim or a CI-gate-threshold derivation.

Scope qualifier — PH-BC-001 no-slip is structurally inapplicable. D0-27: the CS02 inference protocol masks boundary nodes during rollout (v_diff_masked = torch.where(mask2, pred_i_velo, zeros)), freezing wall-node velocities at their step-0 ground-truth value of zero. A no-slip check on this rollout computes ||v_wall|| ~ 0 and PASSes by construction, detecting nothing about the surrogate. P2.2 retired the planned mesh wall-node BC capability-build on this finding. PH-SYM-001/002/003/004 are scoped particle-side only per spec §1.2 and are not exercised on the mesh side.

PH-CON-001 routing — harness, not public rule. PH-CON-001 as shipped in physics-lint v1.0 returns SKIPPED on pde != "heat". CS02 routes PH-CON-001 through the mesh harness as structural-identity reapplication: the mass-conservation identity (∫ρ over the domain, ∇·v on incompressible NS) is reapplied by the harness, validated against the analytical mass- conservation fixture. This is NOT “rule ran without modification” — it is the class-level pattern for V1 rules with input-domain restrictions, and the load-bearing methodology claim of CS02. The shipped CLI and Action do not yet ingest the mesh substrate either (loader.py rejects field.type = "mesh"); CLI/Action loader integration for mesh — and for particle — is planned for v1.2.0 (see docs/backlog/v1.2.md).

The detailed validation harness, the per-trajectory table, the cross-stack table integrating with rung-4a/4b, and the full “what physics-lint did NOT catch” enumeration are below.