# cad-ui ignored-test inventory (UI-00) **Date:** 2026-09-14 **Owner:** UI-00 **CI budget:** `CAD_IGNORED_BUDGET: 20` in `.forgejo/workflows/cad.yml` **Scope:** `crates/apps/cad/cad-core/src` + `crates/apps/cad/cad-ui/src`, counted by `grep -rn '#\[ignore' | wc -l`. ## Counting rule (read this before "fixing" the budget) The gate counts **grep hits for the literal string `#[ignore`**, not `#[ignore]` attributes: - 18 × `#[ignore = "benchmark: ..."]` attributes in `cad-ui/src/profile_benchmarks.rs` - 1 × `#[ignore = "slow: ..."]` attribute in `cad-ui/src/script_bindings.rs` - 1 × doc-comment mention of the literal `#[ignore]` in `cad-ui/src/script_bindings.rs:881` (`/// Marked \`#[ignore]\` because it deliberately burns the whole budget;`) That is **20 grep hits = 19 true attributes + 1 doc mention**. The budget 20 is correct for the grep-defined gate. Do not "correct" it to 19 without also changing the gate predicate and this file. `cad-core/src` currently contributes zero ignores. ## Policy - Every true `#[ignore]` below needs owner, issue, reason, and expiry, one row per test. Owner is the inventorying tranche (UI-00 for all rows at baseline); Issue is the tranche owning final disposition — UI-15 for timing/infra-bound tests bound for nightly/device jobs, UI-00 for the baseline slow-suite entry. - CI fails if the grep count drifts in either direction (silently adding ignores hides coverage; silently dropping the count means the budget is stale) and fails if any expiry date has passed (`No ignore expiry has passed` step in `cad.yml` scans this file for `YYYY-MM-DD`). - Bumping `CAD_IGNORED_BUDGET` requires a tranche note with owner, reason, and expiry. Expiry extensions are reviewable edits here, not silent CI edits. - Genuine infrastructure blockers belong in required nightly/device jobs with expiry (UI-15), not as permanent ignores. ## True ignores (19) | # | File:line | Test fn | Owner | Issue | Reason | Expiry | |---|-----------|---------|-------|-------|--------|--------| | 1 | `profile_benchmarks.rs:68` | `bench_parallel_threshold_warm_vs_cold_cache` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 2 | `profile_benchmarks.rs:148` | `bench_geometry_buffers_shared_by_shape` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 3 | `profile_benchmarks.rs:250` | `bench_param_hash_cost_per_frame` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 4 | `profile_benchmarks.rs:327` | `bench_parts_script_regeneration_per_drag_frame` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 5 | `profile_benchmarks.rs:401` | `bench_pick_broadphase_world_aabb_recompute_vs_cache` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 6 | `profile_benchmarks.rs:507` | `bench_pick_broadphase_mesh_bounds_vs_size` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 7 | `profile_benchmarks.rs:586` | `bench_mesh_cache_hit_cost` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 8 | `profile_benchmarks.rs:620` | `bench_size_parametric_vs_mesh_derived` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 9 | `profile_benchmarks.rs:681` | `bench_scene_cache_hit_vs_rebuild` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 10 | `profile_benchmarks.rs:729` | `bench_glb_export_with_and_without_cache` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 11 | `profile_benchmarks.rs:795` | `bench_frame_submission_budget` | UI-00 | UI-15 | benchmark (counts, not wall-clock): run explicitly with `--ignored` | 2027-06-14 | | 12 | `profile_benchmarks.rs:995` | `bench_shared_cache_export_reuse` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 13 | `profile_benchmarks.rs:1035` | `bench_scene_cache_scaling` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 14 | `profile_benchmarks.rs:1077` | `bench_command_execute_overhead` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 15 | `profile_benchmarks.rs:1145` | `bench_parallel_vs_sequential_export` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 16 | `profile_benchmarks.rs:1186` | `bench_gpu_upload_mesh_source` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 17 | `profile_benchmarks.rs:1296` | `bench_delete_invalidation_clear_vs_evict` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 18 | `profile_benchmarks.rs:1356` | `bench_viewport_snapshot_sync_per_frame` | UI-00 | UI-15 | benchmark: timing-dependent, run explicitly with `--ignored` | 2027-06-14 | | 19 | `script_bindings.rs:884` | `a_runaway_script_is_terminated_by_the_budget` | UI-00 | UI-00 | slow: intentionally runs until the 5 s `CAD_SCRIPT_TIME_BUDGET` trips; would burn minutes in the default suite | 2027-06-14 | Line numbers are advisory (they drift with edits); the CI gate matches test-fn names, and the budget gate matches the grep count. ## Non-attribute hit (1, not a test) - `script_bindings.rs:881` — doc comment `/// Marked \`#[ignore]\` because ...` explaining ignore #19 above. Counts toward the grep budget by construction. If this comment is reworded to avoid the literal, the budget must drop to 19 in the same tranche. ## Demo triage (fixed legitimately — regression guard stays) `cad-ui/src/demo.rs::demo_has_slab_and_wall` **failed** at the UI-00 baseline and was kept red by policy until a legitimate fix landed (UI-02 demo fix): `SceneBuilder::domain_box()` (cad-core `cad_scene.rs`) set layer/material/name but never set `kind_hint`; `CadNode::part_kind()` prefers `kind_hint` and falls back to deriving from the solid — both wall and slab are `CadSolid::Box`, so both classified as `PartKind::Cube` and `demo_counts()` returned `(0, 0)`. - Fix (not a weakening): `domain_box()` takes the domain `PartKind` and records it on the pending node, `commit_pending` carries it into `CadNode.kind_hint`, and `column()` does the same for `Column`; covered by `domain_builders_record_kind_hint` in `cad-core`. `demo.rs` itself is untouched — same test, same assertions. - CI guard: `cad.yml` still asserts `demo.rs` contains the `demo_has_slab_and_wall` test and its `walls >= 1` / `slabs >= 1` assertions, so the regression cannot be hidden by deletion, inversion, or `#[ignore]`.