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 - 33 families, 101 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 | ✓ | ✓ | — | — | — | — |
constant_smagorinsky | turbulence.les_model | — | — | — | — | — | — |
dynamic_smagorinsky | turbulence.les_model | — | — | — | — | — | ✓ |
none | 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 | — | — | — | — | — | — |
k_omega | turbulence.rans_model | — | — | — | — | — | — |
none | turbulence.rans_model | — | — | — | — | — | ✓ |
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 | — | — | — | — | — | — |
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 | — | ✓ | — | — | — | ✓ |
cpipe | grid.generator_type | — | — | — | — | — | — |
pipe | grid.generator_type | — | — | — | — | — | — |
warp | grid.generator_type | — | — | — | — | — | ✓ |
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 | ✓ | — | — | — | — | — |
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 | ✓ | — | — | — | — | — |
Accepted spellings and latent values are omitted: they carry no evidence of their own beyond the canonical value they resolve to.
Three gaps in the current table are worth naming, because they are the ones most likely to matter:
Explicit RK4 has no facets.** src/guide.md records "direct positive-path
momentum solver harnesses, especially explicit RK" as an open coverage gap, and no shipped example selects it. Treat it as unverified.analytical or reference facets. The particle verification examples in Example Catalog are designed to compare against exact solutions, but a numerical acceptance threshold has not been run and gated as part of this work. Design intent is not evidence, so no tick was recorded.experimental. Both are implemented and carry unit coverage in tests/c/test_les.c, including an analytic check of the Germano model tensor and a decomposition-independence check of the coefficient averaging. Neither has a validated coefficient magnitude: no reference-flow comparison has been run and gated. The check that would close the gap is decaying isotropic turbulence with homogeneous averaging, where Cs(t) should settle near 0.16-0.17. The dynamic model declares examples/decaying_isotropic_turbulence as production evidence, which records that the model runs there and reproduces the trends a correct implementation must showThe 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.