Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/facett

.nornir/docs/render-paths-inventory-reasoning.md

Render-paths inventory — every render/output path × its test-matrix emitter

Why this file exists. The recurring failure (2026-06-21 smear) was a bug that hid in an UNINSTRUMENTED render path — the GPU draw_map_gpu lane and the non-map3d components emitted nothing, while only the map3d CPU shade_faces lane produced matrix rows. This inventory enumerates EVERY render/output path in the facett workspace and records, per path, whether it now emits a functional_status row through facett_core::testmatrix::emit (feature testmatrix). A green matrix is only trustworthy when the matrix can prove every path ran — this table is the spec the "every path produced a row" test mirrors.

Emitter seam: facett_core::testmatrix::emit(component, check, ok, detail), gated #[cfg(feature = "testmatrix")] (compiled out + zero-cost in release). Every component/check string below is unique per path so a test can assert each inventory row produced a matrix row.

1. Core render kernel — facett-core::render (the CONS-CORE seam)

The 2-category backend swap (CPU vello / CPU+GPU wgpu) lives here. Both Renderer impls' present() are the canonical lanes every map skin + graphview routes through.

path file:line lane emit component check OK invariant
CpuRenderer::present facett-core/src/render/cpu/mod.rs:451 CPU (vello_cpu) facett-core::render::CpuRenderer::present cpu_render frame dims correct, lit_px>0 on non-empty surface, rgba len == w·h·4
GpuSdfHeadless::present (adapter found) facett-core/src/render/gpu/sdf_pipeline.rs:419 GPU (wgpu) facett-core::render::GpuSdfHeadless::present gpu_render used_gpu=true, instance counts, lit_px>0, rgba len ok
GpuSdfHeadless::present (no adapter → CPU fallback) facett-core/src/render/gpu/sdf_pipeline.rs:445 GPU→CPU fallback facett-core::render::GpuSdfHeadless::present gpu_render_cpu_fallback used_gpu=false, fell back, lit_px>0, rgba len ok

CpuCanvas/Canvas::push_* are pure builders feeding present(); the rasterizer is CpuCanvas::rasterize() whose output is asserted by present() (no separate emit needed — present is the last function feeding pixels). GPU offscreen_render / Map3dPaintCallback::paint are device-side; their output is read back + asserted by present (headless) / the map3d scissor GPU-lane emit (live callback).

2. Map skins — CPU painter lane and GPU lane (the smear-bug locus)

path file:line lane emit component check OK invariant
Map3D::ui → CPU shade_faces painter facett-map3d/src/lib.rs:1268 CPU facett-map3d::shade_faces cpu_render visible_tris>0 on a non-empty mesh
Map3D::draw_map_gpu (wgpu depth-test) facett-map3d/src/lib.rs:876 GPU facett-map3d::draw_map_gpu gpu_render used_gpu=true, visible_tris>0
Map3D part-steps (near_clip … depth_sort) facett-map3d/src/lib.rs:969-1022 CPU chain facett-map3d near_clip/project/frustum_cull/cull/shade/depth_sort per-stage contract (pre-existing)
Map3D scissor (CPU + GPU lanes) facett-map3d/src/lib.rs:849,1282 both facett-map3d scissor ink_outside_rect==0 (pre-existing)
MapView::ui → CPU line painter facett-map/src/lib.rs:459 CPU facett-map::MapView::ui cpu_render geometry>0 (points+ways)
MapView::ui → GPU draw_ways_gpu facett-map/src/lib.rs:459 (lane-tagged) GPU facett-map::MapView::ui gpu_render used_gpu=true, geometry>0
MapView::ui empty / no-bbox exits facett-map/src/lib.rs:373,380 — facett-map::MapView::ui ui_render empty hint / no-bbox = honest row
OsmView::ui → CPU line painter facett-geomap/src/osm2d.rs:925 CPU facett-geomap::osm2d::OsmView::ui cpu_render visible points+ways>0
OsmView::ui → GPU draw_ways_gpu facett-geomap/src/osm2d.rs:925 (lane-tagged) GPU facett-geomap::osm2d::OsmView::ui gpu_render used_gpu=true, visible>0
OsmView::ui empty exit facett-geomap/src/osm2d.rs:809 — facett-geomap::osm2d::OsmView::ui ui_render empty hint
OsmView clip bounds (pre-existing) facett-geomap/src/osm2d/clip.rs:344 CPU facett-geomap.clip bounds_extremes_preserves_onscreen clip contract
GeoMap::ui (CPU-only painter) facett-geomap/src/lib.rs:357 CPU facett-geomap::GeoMap::ui cpu_render points+hotspots+ways>0
GeoMap::ui empty exit facett-geomap/src/lib.rs:245 — facett-geomap::GeoMap::ui ui_render empty hint

3. Graph viewers — offscreen render lanes + Facet ui

path file:line lane emit component check OK invariant
graphview::cpu::render (legacy vello_cpu) facett-graphview/src/cpu.rs:108 CPU facett-graphview::cpu::render cpu_render nodes+edges geometry, lit_px>0, rgba len ok
graphview::render_to_rgba (backend dispatch) facett-graphview/src/lib.rs:77 dispatch facett-graphview::render_to_rgba render_dispatch records Wgpu/VelloCpu arm taken
graphview::render_to_rgba_l0 (CONS-CORE L0 Canvas) facett-graphview/src/l0.rs:133 L0 (routes to core present) facett-graphview::render_to_rgba_l0 l0_render lowered quads/lines per node/edge
Graph3D::ui (CPU 3D projection painter) facett-graph3d/src/lib.rs:334 CPU facett-graph3d::Graph3D::ui ui_render nodes>0, projection all-finite (no NaN/Inf)
Graph3D::ui empty exit facett-graph3d/src/lib.rs:252 — facett-graph3d::Graph3D::ui ui_render empty hint
RabbitLogo3D::ui (CPU + GPU mesh lanes) facett-graph3d/src/logo3d.rs:153,231 CPU/GPU facett-graph3d::RabbitLogo3D::ui ui_render vertices>0, yaw finite, faces≤tris (lane in detail)
GraphView::ui (egui scene) facett-graph/src/lib.rs:73 CPU facett-graph::GraphView::ui ui_render nodes>0 or empty-hint
DepGraphView::ui facett-graph/src/depgraph.rs:226 CPU facett-graph::DepGraphView::ui ui_render nodes>0
SystemChart::ui facett-syschart/src/lib.rs:257 CPU facett-syschart::SystemChart::ui ui_render nodes>0
PipelineView::ui facett-pipeline/src/lib.rs:917 CPU facett-pipeline::PipelineView::ui ui_render nodes>0

4. Data / chart / list components — Facet ui

path file:line emit component check OK invariant
Table::ui facett-table/src/lib.rs:159 facett-table::Table::ui ui_render selected idx < rows.len() + has cols
Grid::ui facett-grid/src/lib.rs:1427 facett-grid::Grid::ui ui_render visible_rows ≤ data.nrows
CardView::ui facett-card/src/lib.rs:407 facett-card::CardView::ui ui_render editing or fields/children non-empty
Console::ui facett-console/src/lib.rs:296 facett-console::Console::ui ui_render a11y count == lines.len ≤ max
DocView::ui (+ empty exit) facett-docview/src/lib.rs:523,697 facett-docview::DocView::ui ui_render visible ≤ pages, current<pages
FileDialog::ui facett-filedialog/src/lib.rs:330 facett-filedialog::FileDialog::ui ui_render filtered ≤ entries, cursor<filtered
JobList::ui (+ empty exit) facett-jobview/src/lib.rs:315,367 facett-jobview::JobList::ui ui_render jobs>0 / empty hint
ProgressView::ui facett-pop/src/lib.rs:84 facett-pop::ProgressView::ui ui_render total>0 or legitimately empty
PlotView::ui facett-plot/src/lib.rs:53 facett-plot::PlotView::ui ui_render all plotted coords finite
VideoPlayer::ui facett-video/src/lib.rs:236 facett-video::VideoPlayer::ui ui_render frame ≤ frames
IcebergView::ui (+ empty exit) facett-icebergview/src/lib.rs:250,313 facett-icebergview::IcebergView::ui ui_render grid rows ≤ page ≤ total
BoxPlotView::ui (+ 2 empty exits) facett-plotters/src/boxplot.rs:149,161,240 facett-plotters::BoxPlotView::ui ui_render summaries ≤ groups
CandlestickView::ui (+ empty exit) facett-plotters/src/candlestick.rs:123,198 facett-plotters::CandlestickView::ui ui_render drawn == bars
TreemapView::ui (+ empty exit) facett-plotters/src/treemap.rs:130,182 facett-plotters::TreemapView::ui ui_render rects ≤ tiles
HeatmapView::ui (+ empty exit) facett-plotters/src/heatmap.rs:121,188 facett-plotters::HeatmapView::ui ui_render rows·cols ≤ data
ViolinView::ui (+ empty exit) facett-plotters/src/violin.rs:140,218 facett-plotters::ViolinView::ui ui_render densities ≤ groups

5. Demo composition surfaces — facett-demo (uses facett::core::testmatrix)

path file:line emit component check OK invariant
SyntheticSdpView::ui facett-demo/src/synthetic_sdp.rs:373 facett-demo::SyntheticSdpView::ui ui_render status buckets partition node count
GraphviewTab::ui facett-demo/src/graphview_tab.rs:177 facett-demo::GraphviewTab::ui ui_render quads≤nodes, lines≤edges, lit_px>0

The demo's binaries (osm2d_demo, osm3d_demo, main) are eframe::App shells that drive the components above; they carry no independent render path of their own, so the component emits cover them.

6. gRPC / tonic service handlers

None in the facett workspace. A workspace-wide search for tonic, #[tonic::, service impls, and async fn RPC handlers found no gRPC server surface in any facett-* crate. (gRPC handlers live in nornir-server, a different repo, out of scope for this task. facett is a library of egui components consumed in-process; it exposes no network/RPC output path.)

Coverage summary

The "every path produced a row" assertion: a matrix test enumerates the component strings in this file and asserts each appears at least once in the run's functional_status rows after driving the components headless.