6.7 KiB
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' <both trees> | 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 incad-ui/src/profile_benchmarks.rs - 1 ×
#[ignore = "slow: ..."]attribute incad-ui/src/script_bindings.rs - 1 × doc-comment mention of the literal
#[ignore]incad-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 passedstep incad.ymlscans this file forYYYY-MM-DD). - Bumping
CAD_IGNORED_BUDGETrequires 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 domainPartKindand records it on the pending node,commit_pendingcarries it intoCadNode.kind_hint, andcolumn()does the same forColumn; covered bydomain_builders_record_kind_hintincad-core.demo.rsitself is untouched — same test, same assertions. - CI guard:
cad.ymlstill assertsdemo.rscontains thedemo_has_slab_and_walltest and itswalls >= 1/slabs >= 1assertions, so the regression cannot be hidden by deletion, inversion, or#[ignore].