PGD-NO high-resolution surrogate
Research-grade — validation in progress.
Proper-Generalized-Decomposition style separable operator surrogate: `src/lib/operator/pgdno/pgdSeparableField.ts` encodes a scalar field on a tensor-product grid as f(x,y,z) ≈ Σ_r w_r·Fx_r(x)·Fy_r(y)·Fz_r(z), touching the full tensor once at encode time and then storing only rank·(nx+ny+nz) numbers, with O(rank) per-point queries. `pgdMatrixVolume.ts` feeds that decomposition to the 3D matrix-volume renderer so only the drawn voxels/slices are evaluated. Physics-driven operator training + promotion gating live in `src/lib/operator/promotionGate.ts` and the `/operator-training` route (loss / residual history and verdict persisted per run).
Surrogate is a separable reconstruction of solver output, NOT a replacement for the kernel — promotion to advisory use requires the residual + verdict gate to pass. TRUST GUARDS SHIPPED — `src/lib/operator/pgdno/pgdTrustEnvelope.ts` adds (a) an extrapolation guard: `buildPgdEnvelope` derives the trained domain from the encoded grid and `evaluatePgdGuarded` REFUSES out-of-envelope queries (`value: null`, named worst axis, overshoot as a fraction of the axis span) instead of silently returning a boundary-clamped number, with an `inside` / `edge` / `outside` verdict and a configurable edge band plus overshoot tolerance; and (b) rank-adaptive refinement: `selectPgdRank` / `refinePgdToTarget` probe reconstruction error against ground truth and return the SMALLEST rank meeting a target relative error, with the full error-vs-rank history and an explicit `met: false` verdict when no probed rank qualifies. Drift-guard: `pgdTrustEnvelope.test.ts` (14 tests). Next ship: surface the envelope verdict as a badge on the `/reservoir-3d` matrix-volume path so a refused voxel reads as 'no training support' rather than blank.
- Using the surrogate in place of a coupled run for field commitment
No phase markers extracted from this row's prose yet.
- No published error band yet — use with engineering judgment.