What confidence this project claims for each capability in the families covered so far.
The table is generated from the capability registry and now covers every public capability family the census recognises - 39 families, 130 canonical values.
A method being documented says nothing about whether it has been verified, which is what this table is for.
Each column is an independent evidence facet, not a rung on a ladder. Production use does not imply analytical verification, and a benchmark comparison does not imply restart equivalence. A capability can be heavily exercised and still never checked against an exact solution.
A row with no ticks is not an error. It means implemented only: the code path exists and runs, and nobody has yet established more than that. That is a legitimate state to record and a dishonest one to hide.
Facet definitions are in Capability Status Vocabulary.
| Capability | Family | Unit verified | Integration/regression verified | Analytical or manufactured-solution verified | Benchmark characterized | Externally/reference validated | Production exercised |
|---|---|---|---|---|---|---|---|
conservation | boundary.handler | ✓ | — | ✓ | — | — | ✓ |
constant_flux | boundary.handler | — | ✓ | ✓ | — | — | — |
constant_velocity | boundary.handler | ✓ | — | ✓ | — | — | ✓ |
geometric | boundary.handler | ✓ | ✓ | ✓ | — | — | — |
initial_flux | boundary.handler | — | ✓ | ✓ | — | — | — |
noslip | boundary.handler | ✓ | — | ✓ | — | — | — |
parabolic | boundary.handler | ✓ | — | ✓ | — | — | — |
prescribed_flow | boundary.handler | ✓ | ✓ | ✓ | — | — | — |
inlet | boundary.type | ✓ | — | ✓ | — | — | ✓ |
outlet | boundary.type | ✓ | — | ✓ | — | — | ✓ |
periodic | boundary.type | ✓ | ✓ | ✓ | — | — | — |
wall | boundary.type | ✓ | — | ✓ | — | — | — |
Dual Time Picard Jameson RK | momentum.solver | ✓ | ✓ | ✓ | — | — | ✓ |
Dual Time Picard RK4 | momentum.solver | — | — | — | — | — | — |
Explicit RK4 | momentum.solver | — | ✓ | ✓ | — | — | — |
Newton Krylov | momentum.solver | ✓ | ✓ | ✓ | — | — | ✓ |
cg | poisson.method | ✓ | — | ✓ | — | — | — |
fgmres | poisson.method | ✓ | ✓ | ✓ | — | — | ✓ |
constant_smagorinsky | turbulence.les_model | — | — | — | ✓ | — | — |
dynamic_smagorinsky | turbulence.les_model | — | — | — | ✓ | ✓ | ✓ |
none | turbulence.les_model | — | — | — | — | — | ✓ |
vreman | turbulence.les_model | ✓ | — | — | ✓ | — | — |
wale | turbulence.les_model | ✓ | — | — | ✓ | — | — |
analytical | eulerian.field_source | — | — | ✓ | — | — | ✓ |
load | eulerian.field_source | — | ✓ | ✓ | — | — | — |
solve | eulerian.field_source | — | — | ✓ | — | — | ✓ |
Constant | initial.field_mode | — | ✓ | ✓ | — | — | ✓ |
Poiseuille | initial.field_mode | ✓ | — | ✓ | — | — | — |
Zero | initial.field_mode | — | — | ✓ | — | — | — |
PointSource | particle.init_mode | — | — | ✓ | — | — | ✓ |
Surface | particle.init_mode | — | — | ✓ | — | — | — |
SurfaceEdges | particle.init_mode | — | — | ✓ | — | — | — |
Volume | particle.init_mode | — | — | ✓ | — | — | ✓ |
CornerAveraged | particle.interpolation | — | ✓ | ✓ | — | — | — |
Trilinear | particle.interpolation | — | — | ✓ | — | — | ✓ |
periodic_deterministic | solver.convergence_mode | — | — | ✓ | — | — | — |
statistical_steady | solver.convergence_mode | — | — | ✓ | — | — | — |
steady_deterministic | solver.convergence_mode | — | — | ✓ | — | — | — |
transient | solver.convergence_mode | — | — | ✓ | — | — | — |
simpson_ik | turbulence.les_test_filter | ✓ | — | — | ✓ | ✓ | — |
volume_weighted_box | turbulence.les_test_filter | — | — | — | ✓ | ✓ | ✓ |
cube_root_volume | turbulence.les_filter_width | — | — | — | ✓ | ✓ | ✓ |
geometric_mean | turbulence.les_filter_width | — | — | — | ✓ | — | — |
max_edge | turbulence.les_filter_width | — | — | — | ✓ | — | — |
scotti | turbulence.les_filter_width | ✓ | — | — | ✓ | — | — |
global | turbulence.les_averaging_mode | — | — | — | ✓ | — | ✓ |
homogeneous | turbulence.les_averaging_mode | — | — | — | ✓ | ✓ | — |
local | turbulence.les_averaging_mode | — | — | — | ✓ | — | — |
clamp | turbulence.les_clip_mode | — | — | — | ✓ | ✓ | ✓ |
clip_negative | turbulence.les_clip_mode | — | — | — | ✓ | — | — |
none | turbulence.les_clip_mode | — | — | — | ✓ | — | — |
TGV3D | analytical.solution_type | — | — | ✓ | — | — | ✓ |
UNIFORM_FLOW | analytical.solution_type | — | — | ✓ | — | — | ✓ |
ZERO_FLOW | analytical.solution_type | — | — | ✓ | — | — | ✓ |
cabot | turbulence.wall_function | ✓ | — | — | — | — | — |
log_law | turbulence.wall_function | ✓ | — | — | — | ✓ | — |
werner | turbulence.wall_function | ✓ | — | — | — | ✓ | ✓ |
ucat | initial.target_field | — | — | ✓ | — | — | ✓ |
ucont | initial.target_field | — | — | ✓ | — | — | — |
msd | statistics.task | ✓ | — | ✓ | — | — | — |
file | grid.mode | — | — | ✓ | — | — | ✓ |
grid_gen | grid.mode | — | — | ✓ | — | — | ✓ |
programmatic_c | grid.mode | — | ✓ | ✓ | — | — | ✓ |
2D | domain.dimensionality | ✓ | — | ✓ | — | — | — |
3D | domain.dimensionality | — | — | ✓ | — | — | ✓ |
box | grid.generator_type | ✓ | — | ✓ | — | — | ✓ |
sweep | grid.generator_type | — | — | ✓ | — | — | ✓ |
circle | grid.cross_section | ✓ | — | ✓ | — | — | — |
rectangle | grid.cross_section | — | — | ✓ | — | — | ✓ |
arc | grid.wall_segment | ✓ | — | ✓ | — | — | — |
flat | grid.wall_segment | — | — | ✓ | — | — | — |
gaussian | grid.wall_segment | — | — | ✓ | — | — | — |
hill | grid.wall_segment | ✓ | — | ✓ | — | — | — |
ramp | grid.wall_segment | ✓ | — | ✓ | — | — | — |
sine | grid.wall_segment | — | — | ✓ | — | — | — |
step | grid.wall_segment | ✓ | — | ✓ | — | — | — |
arc | grid.path_segment | — | — | — | — | — | ✓ |
straight | grid.path_segment | — | — | — | — | — | ✓ |
anchor | grid.transform | — | — | ✓ | — | — | — |
mirror | grid.transform | ✓ | — | ✓ | — | — | — |
permute | grid.transform | ✓ | — | ✓ | — | — | — |
reverse | grid.transform | ✓ | — | ✓ | — | — | — |
rotate | grid.transform | ✓ | — | ✓ | — | — | — |
scale | grid.transform | ✓ | — | ✓ | — | — | — |
translate | grid.transform | ✓ | — | ✓ | — | — | — |
init | particle.restart_mode | — | ✓ | ✓ | — | — | — |
load | particle.restart_mode | — | ✓ | ✓ | — | — | — |
nodal_average | post.eulerian_task | ✓ | — | ✓ | — | — | — |
normalize_field | post.eulerian_task | ✓ | — | ✓ | — | — | — |
q_criterion | post.eulerian_task | ✓ | — | ✓ | — | — | — |
specific_ke | post.lagrangian_task | ✓ | — | ✓ | — | — | — |
line_spectrum | post.spectra_task | ✓ | — | ✓ | — | — | ✓ |
plane_spectrum | post.spectra_task | ✓ | — | ✓ | — | — | ✓ |
shell_spectrum | post.spectra_task | ✓ | — | ✓ | — | — | — |
flux | post.field_statistics_output | ✓ | — | ✓ | — | — | — |
mean | post.field_statistics_output | ✓ | — | ✓ | — | — | — |
reynolds_stress | post.field_statistics_output | ✓ | — | ✓ | — | — | — |
rms | post.field_statistics_output | ✓ | — | ✓ | — | — | — |
tke | post.field_statistics_output | ✓ | — | ✓ | — | — | — |
physical_time | statistics.weighting | ✓ | — | ✓ | — | — | — |
sample | statistics.weighting | ✓ | — | ✓ | — | — | — |
grid_independence | study.type | — | — | — | — | — | ✓ |
sensitivity | study.type | — | — | — | — | — | ✓ |
timestep_independence | study.type | — | — | — | — | — | ✓ |
frozen_momentum_jacobian | momentum.nk_preconditioner | — | ✓ | — | — | — | ✓ |
none | momentum.nk_preconditioner | — | ✓ | — | — | — | ✓ |
auto | storage.compression | ✓ | — | — | — | — | ✓ |
balanced | storage.compression | — | — | — | ✓ | — | ✓ |
fast | storage.compression | ✓ | — | — | ✓ | — | ✓ |
maximum | storage.compression | ✓ | — | — | ✓ | — | ✓ |
none | storage.compression | ✓ | — | — | ✓ | — | ✓ |
carry | run.restart_statistics_state | ✓ | — | ✓ | — | — | — |
reset | run.restart_statistics_state | ✓ | — | ✓ | — | — | — |
copy | workspace.input_import_mode | ✓ | ✓ | — | — | — | ✓ |
hardlink | workspace.input_import_mode | — | ✓ | — | — | — | ✓ |
reference | workspace.input_import_mode | ✓ | ✓ | — | — | — | ✓ |
reflink | workspace.input_import_mode | — | ✓ | — | — | — | ✓ |
analysis-ready | storage.offload_policy | ✓ | — | — | — | — | ✓ |
metadata-only | storage.offload_policy | ✓ | — | — | — | — | ✓ |
restart-ready | storage.offload_policy | ✓ | — | — | — | — | ✓ |
analysis | storage.retention_component | ✓ | — | — | — | — | ✓ |
checkpoints | storage.retention_component | ✓ | — | — | — | — | ✓ |
inputs | storage.retention_component | ✓ | — | — | — | — | ✓ |
logs | storage.retention_component | ✓ | — | — | — | — | ✓ |
raw-output | storage.retention_component | ✓ | — | — | — | — | — |
visualization | storage.retention_component | ✓ | — | — | — | — | ✓ |
channel_spectral_velocity | initial.file_generator | ✓ | — | ✓ | — | — | ✓ |
duct_spectral_velocity | initial.file_generator | ✓ | — | ✓ | — | — | ✓ |
ic_gen | initial.file_generator | ✓ | — | ✓ | — | — | — |
resampled_velocity | initial.file_generator | ✓ | — | ✓ | — | — | — |
spectral_random_velocity | initial.file_generator | ✓ | — | ✓ | — | — | ✓ |
Accepted spellings and latent values are omitted: they carry no evidence of their own beyond the canonical value they resolve to.
PVD indexing is a presentation option within post.pipeline, so it has no separate selector-value row in the generated table. Its direct regression evidence is file:tests/test_cli_smoke.py; run ‘python3 -m pytest -q tests/test_cli_smoke.py -k 'paraview or lineage_enabled_post_plan’`.
| Checked behavior | Direct test |
|---|---|
| Toggling indexing preserves computational recipe identity | test_paraview_series_is_presentation_only_for_recipe_identity |
| Checkpoint times, including a nonzero initial time, survive repeated collection growth | test_paraview_series_uses_checkpoint_physical_time_and_refreshes_live_output |
| Nested A/B/C ancestry clips parents and selects the child at a fork | test_paraview_lineage_flattens_nested_branches_and_child_wins_fork |
| Reinitialized particles start a new collection | test_paraview_particle_series_starts_at_branch_when_particles_reinitialize |
| A child's post plan starts at its first owned cadence step | test_lineage_enabled_post_plan_starts_at_child_owned_cadence |
These tests construct checkpoint metadata and visualization fixtures; they do not run a live concurrent solver or open ParaView. The nested test supplies nonuniform times and frame spacing under one recipe ID. It does not establish stitching across different post strides. make smoke exercises executable solver/post workflows and the supplied templates, but has no dedicated PVD-content assertions. PVD-specific Slurm execution, statistics carry/reset, interrupted-write recovery, pruned-checkpoint fallback, and a real ParaView reader session remain not verified by this evidence. The historical kernel measurements in the generated table do not establish these indexing properties. See 9. io for the implementation's current contract.
Four gaps in the current table are worth naming, because they are the ones most likely to matter:
reference. 125 values cite measurement: records - 42 distinct ones, taken between 2026-09-18 and 2026-10-10 - covering the Picard and Explicit RK4 solvers' orders, duct, channel and pipe Poiseuille flow, the Poisson options and the rewritten Poisson solver, every initial-condition mode, every particle seeding and restart mode, both interpolation methods, the post-processing kernels, field statistics, shell, plane and line spectra, metric closure on every grid-generator feature, the workspace input import modes, and the four generated initial-condition providers, plus Newton–Krylov second-order Hagen-Poiseuille flow on three swept-circle grids, its production execution on a 144-rank turbulent channel and, with the point-block preconditioner, on a three-grid laminar curved duct and a wall-modelled turbulent one, and the storage compression levels, offload policies, and retention components against a Google Drive remote, the three study types run as Slurm arrays, the import of an external periodic velocity field, and the LES models and options against the HOM02 benchmark. Each record states what it does not establish, and none is gated in CI. Twelve records are cited by no value: six not-met ones (the Q-criterion output placement and the generated inlet flux on programmatic_c grids, both since fixed and re-measured, asset reuse for identical inputs, fixed and since confirmed on the cluster by asset-lifecycle-grace-2026-10-01, hom02-les-accuracy-2026-10-09, cited in the LES entries' limitations, and the cabot channel run and the second werner window, cited in those wall functions' entries), the superseded inconclusive drift measurement, the 2026-09-22 wall-seed measurement taken on the former sin(pi t)^4 envelope (superseded by wall-spectral-ic-2026-09-24), and the paired drift, scalar-scatter, pending-job cancellation, and IEM variance-decay measurements, which verify subsystems with no selector value to cite them. The three reference records are all the wall-modelled Re_tau = 1000 channel against Lee & Moser (2015), judged against criteria fixed before the runs, on one grid: wmles-channel-retau1000-werner-2026-10-09 backs werner and the dynamic-Smagorinsky path, wmles-channel-retau1000-loglaw-2026-10-09 backs log_law, and wmles-channel-retau1000-simpson-2026-10-09 backs simpson_ik. The earlier Lee–Moser comparison in turbulent-channel-nk-2026-09-29 retains an 11.4% friction-Reynolds-number discrepancy and 29.3% excess skin friction; its met verdict concerns converged production execution, so it contributes a production facet rather than a reference facet. See 10.2 Retained turbulent-channel campaign (2026-09-29).humphrey-laminar-bend-nk-pointblock-2026-10-07 and humphrey-turbulent-bend-wmles-2026-10-09, whose comparisons with the Humphrey, Taylor & Whitelaw and Taylor, Whitelaw & Yianneskis measurements are exploratory. Metric quality at a resolved step corner is reported by the generator and not validated against a solution.benchmark facets characterize; they do not pass an accuracy test. The four LES models and the averaging, clipping and width options rest on hom02-les-execution-2026-10-09: every model ran HOM02 decaying isotropic turbulence from Wray's DNS field to the end and removed the grid-cutoff pile-up, and the dynamic coefficient settled at 0.18-0.19. The accuracy criteria fixed before those runs were not met (hom02-les-accuracy-2026-10-09): every model ran 18-29% above the DNS energy during start-up from the DNS field, and Vreman missed the low-band spectrum criterion. geometric_mean is supported on hom02-geometric-mean-equivalence-2026-10-09, which shows it equal to cube_root_volume on orthogonal cells, the only cells run. simpson_ik rests on hom02-simpson-ik-2026-10-09 and the channel record below; both showed its former weighting under-dissipative, and its validation is of the corrected one.werner and log_law are validated on the wall-modelled Re_tau ~ 1000 channel (wmles-channel-retau1000-werner-2026-10-09, wmles-channel-retau1000-loglaw-2026-10-09), and werner also runs a production bend. A second window of werner (wmles-channel-retau1000-werner-window2-2026-10-09, not met) put its friction velocity 3.2% high against the 3% bound, so its bias straddles the criterion. cabot failed the same channel (wmles-channel-retau1000-cabot-2026-10-09) and stays experimental. Unit coverage alone said nothing about any of this: until 2026-10-08 werner passed it while applying a cell-averaged relation to a point velocity and over-predicting the channel's friction velocity by 14.5%.The matrix is generated from value_metadata[*].evidence in tests/tooling/capability_families.json and regenerated by make docs-inventory.
Each facet maps to source identifiers (make:<target>, example:<dir>, file:<path>, or measurement:<id>). make audit-capability enforces two things: every declared source must exist, and the capability entry's Evidence part must cite the same source. It does not and cannot verify that the source establishes the claim, so adding a facet remains a deliberate human assertion.
The first three source kinds name something anyone can re-run on demand. That works for unit and integration coverage, and for a shipped example. It does not work for the evidence the analytical, benchmark, and reference facets ask for: a refinement study, a decaying-turbulence coefficient check, a comparison against a published result. Those run once, on a cluster, at a resolution nobody will repeat casually, and the answer is a number rather than a command.
measurement:<id> cites such a run, recorded in tests/tooling/measurement_records.json. A record states the question asked, the date and revision it was taken at, the machine and rank layout that produced it, the configuration that determines the result, what was measured against what threshold, and — required, with none rejected — what the measurement does not establish. A verdict of not-met or inconclusive is a legitimate record: a campaign that failed its threshold is evidence, and deleting it invites the same run again.
make review-packet CAPABILITY=<family> prints the records cited by that family before its verification commands, so a reader planning an expensive run sees what has already been answered first. That is the point of recording them: the registry exists to stop a question being paid for twice, and to give a status promotion something specific to rest on.