You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Master tracking issue for the post-#784 test-suite overhaul. Files #789-#796 are the per-tier child issues spec'd by #787.
This is a planning deliverable — every test file in the repo is accounted for in some child issue's inventory (KEEP / REWRITE / DELETE / ADD). No code changes have been made; the children describe the work the implementer executes.
Architectural context (load before any execution)
The moving-head aim/cal subsystem has been entirely rewritten under #784. Key invariants the test suite must obey post-#784:
mountedInverted is NEVER consulted at runtime. Inversion lives in fixture.rotation = [0, 180, 0]. Any test that asserts mountedInverted changes runtime DMX is wrong → REWRITE to drive rotation, or DELETE.
homeSecondary is FIRST-CLASS — the per-fixture sign source for AimSphere. Construction without Secondary HARD-FAILS with "fixture <id> has no homeSecondary direction calls + offsets". Tests that omit Secondary while expecting aim to work need it added; tests that previously asserted "Secondary deprecated" need rewrite. (Operator's 2026-05-03 reversal on feat: rewrite moving-head aim/cal from scratch — new aim/ package, no legacy imports (supersedes #780, #783) #784.)
Canonical aim endpoint:POST /api/mover/<fid>/aim {x,y,z} or {azDeg,elDeg}. Old /aim-angles is alias-only, deletes in PR-7.
aim/park.go_home(fid) is the canonical "park to home" helper. Tests for park / blackout / abort / cancel / release should drive through it.
desktop/shared/mover_calibrator.py (entire file — SMART probe loop, _set_mover_dmx, _beam_detect_flash, _confirm, _dark_reference, _depth_at_pixel, pan_tilt_to_ray, aim_to_pan_tilt, all legacy battleship/BFS/v2 cal threads).
parent_server.py cal routes (/api/calibration/mover/*), _smart_* helpers, _write_dmx_pose, the cal-mode pulldown.
The aim-angles legacy alias (after one release).
Tests targeting the above: tests/test_coverage_math.py, tests/test_mover_calibration.py, tests/test_mover_inverted.py, tests/test_sphere_model.py, tests/test_sphere_model-DAVEBOOK-5.py, plus ~20 cal-related test files.
tools/emulate_smart_pipeline.py and tests/fixtures/cal/corpus.json (replaced by sphere-model corpus + runner).
The home/secondary/* POST routes STAY — Secondary is first-class per the 2026-05-03 reversal.
Bugs the test gap should have caught
Per #785 round-2 QA (2026-05-03), three concrete bugs in the running aim/sphere.py:
Bug 1 — pan_sign not derived from homeSecondary.panMovedDirection ("right" + offset > 0 should yield pan_sign = -1, but is using +1). All ArUco-marker pans land inverted.
Bug 2 — Below-horizon hemisphere not populated when home is at a tilt extreme. Floor targets snap to equator (tilt_dmx16 ≈ 0).
Bug 3 — current_pose plumbing makes one-off HTTP /aim calls non-deterministic (engine-last-write leaks into multi-valued branch picking).
Bug 5 — aim_xyz(target) and aim_direction(stage_az_from_target, stage_el_from_target) return different DMX (XYZ→angle reduction in routes layer not byte-equivalent to direct angular path).
Replace tools/emulate_smart_pipeline.py + corpus with tools/sphere_corpus_runner.py + tests/fixtures/aim/sphere_corpus.json. 15 required case categories spec'd.
PR-6 — Save-Home wizard backend + aimSphere persistence. Land WITH NEW tests/aim/test_save_home_persistence.py (Tier 1) + NEW tests/test_save_home_wizard.py Playwright (Tier 5) + NEW regression wrapper (Tier 4).
PR-ε — mover_control rewire onto aim/sphere.py. Land WITH REWRITE rows in test_dmx_moving_heads.py, test_remote_math.py, test_mover_control.py (Tier 1) + mountedInverted rewrite in 4 regression files (Tier 4).
PR-7 / PR-η — mass deletion. Every DELETE row in every tier lands in this PR. Includes: 25 cal-test files (Tier 1), test_advanced_scan_recommend.py Playwright (Tier 5), test_smart_pipeline_emulator.py regression shell (Tier 4), tools/emulate_smart_pipeline.py + corpus (Tier 7), tools/devgui/test_registry.py registry update (Tier 8). NEW sphere-corpus + runner + regression wrapper (Tier 7) replace the deleted SMART corpus + emulator in the SAME PR. CLAUDE.md ## Cal-pipeline change checklist (#733) updates with the new runner path.
No test in the suite imports mover_calibrator, coverage_math.{angles_to_dmx, dmx_to_angles, solve_dmx_per_degree, world_to_fixture_pt, fixture_aim_to_world}, sphere_model, _smart_*, _aim_to_pan_tilt, or aim-angles after PR-7.
CLAUDE.md ## Cal-pipeline change checklist (#733) references the new runner path.
Does ApiIntegrationTest.kt call /api/calibration/mover/*?
Is mountedInverted carried in the Android-deserialized JSON?
Does Android Mover Control drive /api/mover/<fid>/aim directly or via /api/remotes/<id>/orient?
Tier 7:
Fate of tools/post_cal_confirm.py and tools/cal_trace/?
Does the corpus runner exercise HTTP /aim or in-process AimSphere only?
Is step=128 the right default for the corpus?
Tier 8:
Does test_registry.py use auto-discovery or a hardcoded list?
Is the Dev GUI used in CI?
These are aggregated from #789-#796. Most resolve via a 5-minute audit during execution; a few need operator decisions (parametric_mover fate, post_cal_confirm fate, cal_trace fate, wizard lock primitive, coverage overlay timing).
Status
Master tracking issue for the post-#784 test-suite overhaul. Files #789-#796 are the per-tier child issues spec'd by #787.
This is a planning deliverable — every test file in the repo is accounted for in some child issue's inventory (KEEP / REWRITE / DELETE / ADD). No code changes have been made; the children describe the work the implementer executes.
Architectural context (load before any execution)
The moving-head aim/cal subsystem has been entirely rewritten under #784. Key invariants the test suite must obey post-#784:
mountedInvertedis NEVER consulted at runtime. Inversion lives infixture.rotation = [0, 180, 0]. Any test that assertsmountedInvertedchanges runtime DMX is wrong → REWRITE to drive rotation, or DELETE.homeSecondaryis FIRST-CLASS — the per-fixture sign source forAimSphere. Construction without Secondary HARD-FAILS with"fixture <id> has no homeSecondary direction calls + offsets". Tests that omit Secondary while expecting aim to work need it added; tests that previously asserted "Secondary deprecated" need rewrite. (Operator's 2026-05-03 reversal on feat: rewrite moving-head aim/cal from scratch — new aim/ package, no legacy imports (supersedes #780, #783) #784.)POST /api/mover/<fid>/aim {x,y,z}or{azDeg,elDeg}. Old/aim-anglesis alias-only, deletes in PR-7.aim/park.go_home(fid)is the canonical "park to home" helper. Tests for park / blackout / abort / cancel / release should drive through it.aim/module boundaries. Tests reinforce.Deletion-track summary (PR-7 / PR-η)
Confirmed deletion list per #784 PR-7 + #782 PR-η:
desktop/shared/coverage_math.pyIK functions:solve_dmx_per_degree,angles_to_dmx,dmx_to_angles,world_to_fixture_pt,fixture_aim_to_world. (_mount_rotation/_matvec/_transposemay stay if camera-coverage code consumes them.)desktop/shared/sphere_model.py(the pre-feat: rewrite moving-head aim/cal from scratch — new aim/ package, no legacy imports (supersedes #780, #783) #784 pseudo-sphere class).desktop/shared/mover_calibrator.py(entire file — SMART probe loop,_set_mover_dmx,_beam_detect_flash,_confirm,_dark_reference,_depth_at_pixel,pan_tilt_to_ray,aim_to_pan_tilt, all legacy battleship/BFS/v2 cal threads).parent_server.pycal routes (/api/calibration/mover/*),_smart_*helpers,_write_dmx_pose, the cal-mode pulldown.aim-angleslegacy alias (after one release).tests/test_coverage_math.py,tests/test_mover_calibration.py,tests/test_mover_inverted.py,tests/test_sphere_model.py,tests/test_sphere_model-DAVEBOOK-5.py, plus ~20 cal-related test files.tools/emulate_smart_pipeline.pyandtests/fixtures/cal/corpus.json(replaced by sphere-model corpus + runner).The
home/secondary/*POST routes STAY — Secondary is first-class per the 2026-05-03 reversal.Bugs the test gap should have caught
Per #785 round-2 QA (2026-05-03), three concrete bugs in the running
aim/sphere.py:pan_signnot derived fromhomeSecondary.panMovedDirection("right" + offset > 0 should yieldpan_sign = -1, but is using+1). All ArUco-marker pans land inverted.tilt_dmx16 ≈ 0).current_poseplumbing makes one-off HTTP/aimcalls non-deterministic (engine-last-write leaks into multi-valued branch picking).target == fixture_xyz) returns valid DMX instead of None.aim_xyz(target)andaim_direction(stage_az_from_target, stage_el_from_target)return different DMX (XYZ→angle reduction in routes layer not byte-equivalent to direct angular path).The Tier 1 + Tier 7 ADD rows lock these down.
Child issue list
test_parent.py, ADD rows foraim/park, sphere round-trip,current_posedeterminism, blackout.test_camera.py,test_beam_detector.py, etc. Single REWRITE row for any cal-integration subsection.mountedInvertedrewrites in 4 files,test_smart_pipeline_emulator.pyDELETE,test_post_cal_confirm.pyAUDIT, NEWtest_save_home_wizard.py+test_park.py.mountedInvertedmigration UI test.mountedInvertedoraim-anglesreferences.tools/emulate_smart_pipeline.py+ corpus withtools/sphere_corpus_runner.py+tests/fixtures/aim/sphere_corpus.json. 15 required case categories spec'd.tools/devgui/test_registry.pyrewrite to drop deleted-test entries; one-click runner shortcuts for new tests.PR sequencing (overall merge order)
Per #782 status update + this overhaul:
go_home, sphere endpoint, park-path migrations).current_posedefaulting, degenerate-target guard,aim_xyzround-trip. Land WITH the corresponding ADD-row tests intests/aim/test_sphere.pyandtests/aim/test_routes.py(Tier 1).aimSpherepersistence. Land WITH NEWtests/aim/test_save_home_persistence.py(Tier 1) + NEWtests/test_save_home_wizard.pyPlaywright (Tier 5) + NEW regression wrapper (Tier 4).mover_controlrewire ontoaim/sphere.py. Land WITH REWRITE rows intest_dmx_moving_heads.py,test_remote_math.py,test_mover_control.py(Tier 1) +mountedInvertedrewrite in 4 regression files (Tier 4).test_advanced_scan_recommend.pyPlaywright (Tier 5),test_smart_pipeline_emulator.pyregression shell (Tier 4),tools/emulate_smart_pipeline.py+ corpus (Tier 7),tools/devgui/test_registry.pyregistry update (Tier 8). NEW sphere-corpus + runner + regression wrapper (Tier 7) replace the deleted SMART corpus + emulator in the SAME PR. CLAUDE.md## Cal-pipeline change checklist (#733)updates with the new runner path.bake_engineOption-A migration (angle-pair bake). Re-validatetest_dmx_actions.py,test_dmx_bake.py,test_show_generator.py,test_show_playback.py,test_smart_bake.py,test_capability_bake_e2e.py,test_timeline_bake.py,test_mover_tracking.py.Done definition
tests/fixtures/aim/sphere_corpus.json) with the 15 required case categories.tools/emulate_smart_pipeline.py,tests/fixtures/cal/corpus.json).python tests/test_parent.pypasses after PR-7.python tests/regression/run_all.pypasses after PR-7.python tests/regression/run_all.py --live-rigpasses against a calibrated mover post-PR-7.python tools/sphere_corpus_runner.py --verboseexits 0.mover_calibrator,coverage_math.{angles_to_dmx, dmx_to_angles, solve_dmx_per_degree, world_to_fixture_pt, fixture_aim_to_world},sphere_model,_smart_*,_aim_to_pan_tilt, oraim-anglesafter PR-7.## Cal-pipeline change checklist (#733)references the new runner path.Cross-references to existing test issues
test_full_show.pyis the file referenced).test_layout_edit.pyrewrite).Architecture predecessors / drivers
main:44e8099).aim/package.Open questions surfaced in child issues (collated for human review)
Tier 1:
parametric_mover.pyon PR-7 deletion list, or retained for a non-cal consumer?fixture_pose_solver.py(feat: Verify fixture pose wizard — operator-driven X/Z calibration before mover-cal #699) on the deletion list?pixel_to_stage/stage_to_pixel/pick_calibration_targetsrelocate whenmover_calibrator.pydeletes?pan_tilt_to_ray/aim_to_pan_tilt(consumed bytest_remote_math.py) relocate?_set_calibrating/_fixture_is_calibrating, or need a fresh lock primitive?_apply_marker_z_alignment+/api/space/shiftsurvive PR-7?cal_tracerecorder get repurposed for wizard diagnostics or delete?pick_calibration_targets?Tier 2:
tests/test_camera.pyhave a SMART-driven subsection?tests/test_cv_engine.pyimport frommover_calibrator?Tier 4:
tools/post_cal_confirm.pysurvive PR-7?mover_calibrations.jsonsurvive PR-7?test_beam_detect_canary.pydriver use a deletion-track route?Tier 5:
test_spa.pyhave a Calibration-tab subsection?screenshot_capture.pybaselines pre-feat: replace 2-pair affine cal with profile-derived sphere model — Home-only calibration, Secondary deprecated (supersedes #780 P1+P2) #783 or post-feat: replace 2-pair affine cal with profile-derived sphere model — Home-only calibration, Secondary deprecated (supersedes #780 P1+P2) #783?test_red_chair.pyPlaywright or unit?Tier 6:
ApiIntegrationTest.ktcall/api/calibration/mover/*?mountedInvertedcarried in the Android-deserialized JSON?/api/mover/<fid>/aimdirectly or via/api/remotes/<id>/orient?Tier 7:
tools/post_cal_confirm.pyandtools/cal_trace/?/aimor in-processAimSphereonly?step=128the right default for the corpus?Tier 8:
test_registry.pyuse auto-discovery or a hardcoded list?These are aggregated from #789-#796. Most resolve via a 5-minute audit during execution; a few need operator decisions (parametric_mover fate, post_cal_confirm fate, cal_trace fate, wizard lock primitive, coverage overlay timing).