nigig-org/crates/apps/cad/cad-ui/IGNORED_TESTS.md

6.7 KiB
Raw Permalink Blame History

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 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].