DFIT analytical benchmark suite ALL PASSED
Live view of the same suite that runs on every CI build. 3 benchmarks compared on a fixed log-spaced time grid (1 → 1024 s) with a 0.05 log-tolerance ceiling. Drift past tolerance = scoreboard flip required.
Tip-kernel knobs
Osher–Sethian monotone upwind gradient on tipPropagationStep.
Dontsov–Peirce 2017 max-of-asymptotes blend of K-vertex Charles and M-vertex viscous V_M.
Sussman-Smereka-Osher 1994 — auto-call between front-motion steps so |∇φ| ≈ 1 stays put. Off by default.
Saved per workspace. Apply restores the knobs above to the preset's snapshot.
No presets saved yet.
Local controls
Re-runs the suite locally — does not change CI defaults. Density applies to the long-time PKN + Carter grid; the KGD-Newton entry keeps its locked [1, 2] s window.
Phase 7 inc 16 — pick which kernel each benchmark exercises. Only KGD currently exposes both newton-kernel (fixed-tip Newton step) and live-kernel (MK moving-tip wrapper); PKN + Carter are live-kernel only today.
Applies to "Download tip diagnostics CSV" and "Download combined CSV". The two ID columns (benchmark_id, runner_label) are always included.
No saved presets yet. Save the current grid/tolerance settings with a label to switch back to them in one click.
Per-benchmark results
| Benchmark | Status | RMS log-residual | Max log-residual | Tolerance | N samples |
|---|---|---|---|---|---|
| kgd-width | PASS | 7.02e-2 | 7.56e-2 | 1.15e-1 | 2 |
| pkn-length | PASS | 1.33e-1 | 1.80e-1 | 1.50e-1 | 2 |
| carter-falloff | PASS | 6.95e-8 | 9.82e-8 | 1.00e-5 | 2 |
Compare against a previous run
Upload a previously downloaded dfit-benchmarks-*.json to diff its PASS/FAIL + residuals against the current run above.
No baseline loaded yet.
Residuals over time
Shaded band = ±tolerance. Red markers = samples outside the band.
KGD fixed-tip vs moving-tip [m, log₁₀ residual]
Side-by-side widths on the canonical [1, 2] s window against the Spence–Sharp analytical reference. Moving-tip uses the MK-universal wrapper (Phase 7 inc 13); fixed-tip is the legacy strip Newton (Phase 6 inc 4). RMS is √(mean(log₁₀(w_run / w_ref)²)).
Toggle on to recompute both runners on the canonical inputs.
Window sweep (preview)
Compares the registry-locked window against a wider preview window per live-kernel entry. Doesn't touch the CI gate or the kernel.
Mesh adapt & tip-BC are wired through to each runner: PKN uses adaptiveTipFocus + cohesiveTipBC, KGD uses bumped reinit iterations + cohesiveTipBC, Carter doubles cell count for tip-refined (no propagating tip — tip-BC echoed for traceability). Defaults preserve the registry rms byte-for-byte.
[1, 2] s·Preview: [1, 4] s, 3 ptsrms_log10 vs window
Sweeps t_end across the requested range with t_start fixed and plots the rms log10 residual returned by the active runner.
meshAdapt (uniform / tip-refined), tipBC (free / kic-clamped), and Carter Q sizing (constant / auto). Headroom (Δ = tolerance − rms) ≥ 0 ⇒ healthy. Default filter shows all 48 rows.| Entry | Window [s] | meshAdapt | tipBC | Q | rms [log] | tol [log] | Δ [log] | Headroom | Status |
|---|---|---|---|---|---|---|---|---|---|
| kgd-width | [1, 2] · n=2 | uniform | free | — | 7.023e-2 | 1.150e-1 | +4.477e-2 | PASS | |
| kgd-width | [0.5, 1] · n=2 | uniform | free | — | 1.908e-1 | 1.150e-1 | -7.576e-2 | FAIL | |
| kgd-width | [1, 4] · n=2 | uniform | free | — | 2.432e-1 | 1.150e-1 | -1.282e-1 | FAIL | |
| kgd-width | [1, 2] · n=2 | uniform | kic-clamped | — | 1.070e-1 | 1.150e-1 | +7.968e-3 | PASS | |
| kgd-width | [0.5, 1] · n=2 | uniform | kic-clamped | — | 1.999e-1 | 1.150e-1 | -8.489e-2 | FAIL | |
| kgd-width | [1, 4] · n=2 | uniform | kic-clamped | — | 2.427e-1 | 1.150e-1 | -1.277e-1 | FAIL | |
| kgd-width | [1, 2] · n=2 | tip-refined | free | — | 7.023e-2 | 1.150e-1 | +4.477e-2 | PASS | |
| kgd-width | [0.5, 1] · n=2 | tip-refined | free | — | 1.908e-1 | 1.150e-1 | -7.576e-2 | FAIL | |
| kgd-width | [1, 4] · n=2 | tip-refined | free | — | 2.432e-1 | 1.150e-1 | -1.282e-1 | FAIL | |
| kgd-width | [1, 2] · n=2 | tip-refined | kic-clamped | — | 1.070e-1 | 1.150e-1 | +7.968e-3 | PASS | |
| kgd-width | [0.5, 1] · n=2 | tip-refined | kic-clamped | — | 1.999e-1 | 1.150e-1 | -8.489e-2 | FAIL | |
| kgd-width | [1, 4] · n=2 | tip-refined | kic-clamped | — | 2.427e-1 | 1.150e-1 | -1.277e-1 | FAIL | |
| pkn-length | [0.5, 1] · n=2 | uniform | free | — | 1.334e-1 | 1.500e-1 | +1.657e-2 | PASS | |
| pkn-length | [0.25, 0.5] · n=2 | uniform | free | — | 3.176e-1 | 1.500e-1 | -1.676e-1 | FAIL | |
| pkn-length | [1, 2] · n=2 | uniform | free | — | 2.113e-1 | 1.500e-1 | -6.130e-2 | FAIL | |
| pkn-length | [0.5, 1] · n=2 | uniform | kic-clamped | — | 3.368e-1 | 1.500e-1 | -1.868e-1 | FAIL | |
| pkn-length | [0.25, 0.5] · n=2 | uniform | kic-clamped | — | 5.346e-1 | 1.500e-1 | -3.846e-1 | FAIL | |
| pkn-length | [1, 2] · n=2 | uniform | kic-clamped | — | 2.081e-1 | 1.500e-1 | -5.813e-2 | FAIL | |
| pkn-length | [0.5, 1] · n=2 | tip-refined | free | — | 1.334e-1 | 1.500e-1 | +1.657e-2 | PASS | |
| pkn-length | [0.25, 0.5] · n=2 | tip-refined | free | — | 3.176e-1 | 1.500e-1 | -1.676e-1 | FAIL | |
| pkn-length | [1, 2] · n=2 | tip-refined | free | — | 2.113e-1 | 1.500e-1 | -6.130e-2 | FAIL | |
| pkn-length | [0.5, 1] · n=2 | tip-refined | kic-clamped | — | 3.368e-1 | 1.500e-1 | -1.868e-1 | FAIL | |
| pkn-length | [0.25, 0.5] · n=2 | tip-refined | kic-clamped | — | 5.346e-1 | 1.500e-1 | -3.846e-1 | FAIL | |
| pkn-length | [1, 2] · n=2 | tip-refined | kic-clamped | — | 2.081e-1 | 1.500e-1 | -5.813e-2 | FAIL | |
| carter-falloff | [1, 2] · n=2 | uniform | free | constant | 6.947e-8 | 1.000e-5 | +9.931e-6 | PASS | |
| carter-falloff | [0.5, 1] · n=2 | uniform | free | constant | 2.001e-8 | 1.000e-5 | +9.980e-6 | PASS | |
| carter-falloff | [2, 10] · n=2 | uniform | free | constant | 9.980e-7 | 1.000e-5 | +9.002e-6 | PASS | |
| carter-falloff | [1, 2] · n=2 | uniform | free | auto | 6.947e-8 | 1.000e-5 | +9.931e-6 | PASS | |
| carter-falloff | [0.5, 1] · n=2 | uniform | free | auto | 2.001e-8 | 1.000e-5 | +9.980e-6 | PASS | |
| carter-falloff | [2, 10] · n=2 | uniform | free | auto | 9.980e-7 | 1.000e-5 | +9.002e-6 | PASS | |
| carter-falloff | [1, 2] · n=2 | uniform | kic-clamped | constant | 6.947e-8 | 1.000e-5 | +9.931e-6 | PASS | |
| carter-falloff | [0.5, 1] · n=2 | uniform | kic-clamped | constant | 2.001e-8 | 1.000e-5 | +9.980e-6 | PASS | |
| carter-falloff | [2, 10] · n=2 | uniform | kic-clamped | constant | 9.980e-7 | 1.000e-5 | +9.002e-6 | PASS | |
| carter-falloff | [1, 2] · n=2 | uniform | kic-clamped | auto | 6.947e-8 | 1.000e-5 | +9.931e-6 | PASS | |
| carter-falloff | [0.5, 1] · n=2 | uniform | kic-clamped | auto | 2.001e-8 | 1.000e-5 | +9.980e-6 | PASS | |
| carter-falloff | [2, 10] · n=2 | uniform | kic-clamped | auto | 9.980e-7 | 1.000e-5 | +9.002e-6 | PASS | |
| carter-falloff | [1, 2] · n=2 | tip-refined | free | constant | 2.482e-7 | 1.000e-5 | +9.752e-6 | PASS | |
| carter-falloff | [0.5, 1] · n=2 | tip-refined | free | constant | 7.113e-8 | 1.000e-5 | +9.929e-6 | PASS | |
| carter-falloff | [2, 10] · n=2 | tip-refined | free | constant | 3.594e-6 | 1.000e-5 | +6.406e-6 | PASS | |
| carter-falloff | [1, 2] · n=2 | tip-refined | free | auto | 2.482e-7 | 1.000e-5 | +9.752e-6 | PASS | |
| carter-falloff | [0.5, 1] · n=2 | tip-refined | free | auto | 7.113e-8 | 1.000e-5 | +9.929e-6 | PASS | |
| carter-falloff | [2, 10] · n=2 | tip-refined | free | auto | 3.594e-6 | 1.000e-5 | +6.406e-6 | PASS | |
| carter-falloff | [1, 2] · n=2 | tip-refined | kic-clamped | constant | 2.482e-7 | 1.000e-5 | +9.752e-6 | PASS | |
| carter-falloff | [0.5, 1] · n=2 | tip-refined | kic-clamped | constant | 7.113e-8 | 1.000e-5 | +9.929e-6 | PASS | |
| carter-falloff | [2, 10] · n=2 | tip-refined | kic-clamped | constant | 3.594e-6 | 1.000e-5 | +6.406e-6 | PASS | |
| carter-falloff | [1, 2] · n=2 | tip-refined | kic-clamped | auto | 2.482e-7 | 1.000e-5 | +9.752e-6 | PASS | |
| carter-falloff | [0.5, 1] · n=2 | tip-refined | kic-clamped | auto | 7.113e-8 | 1.000e-5 | +9.929e-6 | PASS | |
| carter-falloff | [2, 10] · n=2 | tip-refined | kic-clamped | auto | 3.594e-6 | 1.000e-5 | +6.406e-6 | PASS |
A/B comparison (preview)
Runs two solver settings on the same window range and plots rms_log10 / max_log10 deltas (B − A). Doesn't touch the CI gate.
Registry-window comparison
Scores every live-kernel entry on both registry windows ([1, 2] s and [0.5, 1] s) under the same solver settings. Use it to evaluate the meshAdapt / tipBC tightening work before flipping the scoreboard. Doesn't touch the CI gate or the kernel.
| Entry | Registry | rms [1, 2] s | rms [0.5, 1] s | Δ rms (tight − wide) | max [1, 2] s | max [0.5, 1] s |
|---|---|---|---|---|---|---|
| KGD width | [1, 2] s | 7.0234e-2 | 1.9076e-1 | 1.2052e-1 | 7.5640e-2 | 2.6220e-1 |
| PKN length | [0.5, 1] s | 2.1130e-1 | 1.3343e-1 | -7.7875e-2 | 2.9365e-1 | 1.8038e-1 |
| Carter falloff | [1, 2] s | 6.9466e-8 | 2.0013e-8 | -4.9453e-8 | 9.8172e-8 | 2.8212e-8 |
Compare saved runs
Pin the current density / tolerance configuration as a snapshot and view PASS/FAIL + residual charts side-by-side.
No saved runs yet. Adjust the controls above and hit Save current run.
CI log preview
DFIT benchmark suite @ 2026-05-24T14:33:06.036Z — PASS (3 benchmarks) [PASS] kgd-width rms=7.02e-2 max=7.56e-2 tol=1.15e-1 n=2 [PASS] pkn-length rms=1.33e-1 max=1.80e-1 tol=1.50e-1 n=2 [PASS] carter-falloff rms=6.95e-8 max=9.82e-8 tol=1.00e-5 n=2
Truncation diagnostic — width & half-length over time
legacy vs mkTipFeedback vs reinit, per KGD benchmarkpeak |Δw| mk−legacy: 6.51e-4 m · peak |Δw| reinit−legacy: 6.51e-4 m · peak |Δp| mk−legacy: 3.54e+7 Pa · peak |Δp| reinit−legacy: 3.54e+7 Pa · rows: 2
Temperature T(t): — KGD kernel is isothermal; row schema reserves T columns for future thermal-coupled kernels.
Registry
- kgd-width · tol 0.115 (log10) · runner: coupledNewtonStep + MK moving-tip + reinit i=8 (Phase 7 inc 15) (live kernel)
- pkn-length · tol 0.15 (log10) · runner: coupledNewtonStep (Phase 3.5 kernel, height-contained) (live kernel)
- carter-falloff · tol 0.00001 (log10) · runner: coupledNewtonStep + Carter sink mass-balance recovery (Phase 7 inc 14) (live kernel)
Phase 6 inc 4 wired the kgd-width entry into the live coupledNewtonStep kernel (1D strip, 41 cells, [1, 2] s window). PKN + Carter still self-reference until their kernels land.
Timestamp: 2026-05-24T14:33:06.036Z
μ × dt solver diagnostics
Convergence status, residual trend, and failure-mode label for every (μ [cp], dt [d]) cell in the viscosity sweep grid.
| μ [cp] \ dt [d] | 0.2 | 0.5 | 1 | 5 | 20 | 100 |
|---|---|---|---|---|---|---|
| 0.5 | Pass | Pass | Pass | Pass | Pass | Pass |
| 1 | Pass | Pass | Pass | Pass | Pass | Pass |
| 2 | Pass | Pass | Pass | Pass | Pass | Skipped (dt cap) — |
| 5 | Pass | Pass | Pass | Pass | Pass | Skipped (dt cap) — |
Sparklines show per-step CG residual on a log scale. Failure-mode labels come from classifyFailureMode with default thresholds (residualTol = 1e-6, settleRatioTol = 0.05).
Drift-guard tolerance-margin heatmap [μ × dt]
Color = 1 − |Δ| / envelope. Green = envelope sits well above observed deviation; amber = tight; red = envelope violated.
| μ [cp] \ dt [d] | 0.2 | 0.5 | 1 | 5 | 20 | 100 |
|---|---|---|---|---|---|---|
| 0.5 | 1.001.00e+3 psi | 1.001.00e+3 psi | 1.001.00e+3 psi | 1.001.00e+3 psi | 1.009.99e+2 psi | 1.009.99e+2 psi |
| 1 | 1.002.00e+3 psi | 1.002.00e+3 psi | 1.002.00e+3 psi | 1.002.00e+3 psi | 1.002.00e+3 psi | 1.002.00e+3 psi |
| 2 | 1.004.00e+3 psi | 1.004.00e+3 psi | 1.004.00e+3 psi | 1.004.00e+3 psi | 1.004.00e+3 psi | —skip |
| 5 | 1.001.00e+4 psi | 1.001.00e+4 psi | 1.001.00e+4 psi | 1.001.00e+4 psi | 1.001.00e+4 psi | —skip |
Envelope per μ comes from tolerancesFor({ viscosityCp: μ }).pInitEnvelopePsi. Observed |Δ| uses the synthetic probe'smaxAbsStepDelta from the diagnostics recorder — same quantity the failure classifier inspects.
Pass/fail matrices — capped vs uncapped (with headroom)
Tightens the analytical envelope to E / (1 + headroomFraction) and recolors both matrices live. Use it to ask: "what still fails if I require an extra X% buffer?"
Effective envelope per μ = tolerancesFor(μ).pInitEnvelopePsi / 1.00. Capped fails: 0 · Uncapped fails: 0.
Downloads
Wide / long / fail-frequency CSVs for both capped & uncapped grids at the current metric and headroom.Capped (μ ≥ 2 ⇒ dt ≤ 20 d)
0 fail · 0 tight · 22 safe · 2 skip| μ \ dt | 0.2 | 0.5 | 1 | 5 | 20 | 100 |
|---|---|---|---|---|---|---|
| 0.5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 2 | ✓ | ✓ | ✓ | ✓ | ✓ | — |
| 5 | ✓ | ✓ | ✓ | ✓ | ✓ | — |
Uncapped (full dt grid)
0 fail · 0 tight · 24 safe · 0 skip| μ \ dt | 0.2 | 0.5 | 1 | 5 | 20 | 100 |
|---|---|---|---|---|---|---|
| 0.5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
✓ = pass / safe · ! = tight · ✗ = envelope violated · — = skipped by dt cap. Cell color follows the same diverging palette as the tolerance-margin heatmap above.
Failure-prone heatmap [μ × dt] — worst of all metrics
Color = failed metrics ÷ ran metrics at this (μ, dt) acrossp_wf·p_cell·p_probe. Top-N most failure-prone cells get a ranked ring.
| μ [cp] \ dt [d] | 0.2 | 0.5 | 1 | 5 | 20 | 100 |
|---|---|---|---|---|---|---|
| 0.5 | ||||||
| 1 | ||||||
| 2 | ||||||
| 5 |
Sweep results summary — what changed
Diffs current settings against the baseline (capped grid, headroom = 0). Lists re-enabled cells, newly failing cells, recoveries, and outstanding regressions, plus the drift-guard tests they gate.
| Change | μ [cp] | dt [d] | Baseline | Current | Δ headroom [psi] |
|---|---|---|---|---|---|
| Re-enabled | 2 | 100 | skipped | safe | — |
| Re-enabled | 5 | 100 | skipped | safe | — |
Drift-guard tests affected by the visco sweep
Re-run these vitest files before merging any envelope or sweep change. Each one snapshots a piece of the (μ, dt) plumbing surfaced on this page.
src/lib/reservoir/__tests__/viscoSweepMatrixCsv.test.ts— WIDE / LONG / fail-frequency CSV builders.src/lib/reservoir/__tests__/viscoToleranceMargin.test.ts— Envelope vs deviation status bucketing.src/lib/reservoir/__tests__/viscoDiagCsv.test.ts— Per-(μ, dt) diagnostics grid CSV.src/lib/reservoir/__tests__/viscoDiagFailingCsv.test.ts— Failing-only CSV (rank by worst headroom).src/lib/reservoir/__tests__/viscoSolverDiagnosticsDemo.test.ts— Synthetic μ × dt grid that drives the page.src/lib/__tests__/adaptiveEnvelopeCalibration.test.ts— Per-μ envelope re-calibration from observed deviations.src/lib/__tests__/perPointMultiplierSearch.test.ts— Per-(μ, dt) multiplier lift search.
Quick command: bunx vitest run src/lib/reservoir/__tests__/viscoSweepMatrixCsv.test.ts src/lib/reservoir/__tests__/viscoToleranceMargin.test.ts src/lib/reservoir/__tests__/viscoDiagCsv.test.ts src/lib/reservoir/__tests__/viscoDiagFailingCsv.test.ts src/lib/reservoir/__tests__/viscoSolverDiagnosticsDemo.test.ts src/lib/__tests__/adaptiveEnvelopeCalibration.test.ts src/lib/__tests__/perPointMultiplierSearch.test.ts
Per-(μ, dt) adaptive multiplier search
Lifts envelope ONLY at failing cells until |Δ| · (1 + headroomFraction) ≤ E_μ · m. Increase headroom to push failing cells under the cap; capped cells remain genuine envelope blow-outs.
| μ [cp] | dt [d] | |Δ| [psi] | E_μ [psi] | m | E·m [psi] | headroom [psi] | status |
|---|---|---|---|---|---|---|---|
| 0.5 | 0.2 | 0.000 | 1.250 | 1.00× | 1.250 | 1.250 | pass |
| 0.5 | 1 | 0.100 | 1.250 | 1.00× | 1.250 | 1.145 | pass |
| 0.5 | 5 | 0.200 | 1.250 | 1.00× | 1.250 | 1.040 | pass |
| 0.5 | 100 | 0.600 | 1.250 | 1.00× | 1.250 | 0.620 | pass |
| 1 | 0.2 | 0.000 | 2.500 | 1.00× | 2.500 | 2.500 | pass |
| 1 | 1 | 0.100 | 2.500 | 1.00× | 2.500 | 2.395 | pass |
| 1 | 5 | 0.300 | 2.500 | 1.00× | 2.500 | 2.185 | pass |
| 1 | 100 | 1.200 | 2.500 | 1.00× | 2.500 | 1.240 | pass |
| 2 | 0.2 | 0.000 | 5.000 | 1.00× | 5.000 | 5.000 | pass |
| 2 | 1 | 0.100 | 5.000 | 1.00× | 5.000 | 4.895 | pass |
| 2 | 5 | 0.400 | 5.000 | 1.00× | 5.000 | 4.580 | pass |
| 2 | 100 | 12.000 | 5.000 | 2.53× | 12.650 | 0.050 | lifted |
| 5 | 0.2 | 0.000 | 12.500 | 1.00× | 12.500 | 12.500 | pass |
| 5 | 1 | 0.100 | 12.500 | 1.00× | 12.500 | 12.395 | pass |
| 5 | 5 | 0.600 | 12.500 | 1.00× | 12.500 | 11.870 | pass |
| 5 | 100 | 32.000 | 12.500 | 2.69× | 33.625 | 0.025 | lifted |
Pilot grid: 4 viscosities × 4 dt levels (synthetic). Base envelope per μ comes from tolerancesFor({ viscosityCp: μ }).spreadAcrossSweepPsi with the tight preset.
μ × dt pass/fail matrix chart
Interactive view of the chart-ready LONG CSV (buildViscoSweepMatrixLongCsv). Paste your export or load the demo dataset; click a cell to pin its numbers.
| μ [cp] \ dt [d] | 0.2 | 0.5 | 1 | 5 | 20 | 100 |
|---|---|---|---|---|---|---|
| 0.5 | ||||||
| 1 | ||||||
| 2 | ||||||
| 5 |
Color intensity scales with |headroom| (deeper green = more headroom; deeper red = larger overshoot vs envelope). Multi-metric inputs collapse to the worst status per (μ, dt) across the selected metric chips.