Open follow-ups have moved to GitHub issues — see
label:area:cleanup.
This file keeps the settled experiments and their conclusions so the
“why” survives in repo history.
Conclusion from experiments (2026-05-03): click position has no measurable effect on ball trajectory.
The earlier “click matters” reading was confounded by perturbation-sweep luck and a small number of flukey makes. The clean isolation experiments disproved it.
CLICK_STRATEGY constants and all branches in _pick_click_positionVARIED_CLICK_POSITIONS, CLICK_SWEEP_Y_OFFSETS,
CLICK_EXTREME_POSITIONS constantsEXPERIMENT_MODE env-var dispatch in minigames/hoops/main.py;
removed the two click experiments from the hoops launcher entry
(kept the general experiments slot for future use)tests/test_click_strategy.py deleted_pick_click_position inlined at the call site (was a one-liner)experiments config slot removed (was empty, plus
its extra_env plumbing in _start_bot / _spawn)click_x / click_y to shots.db. Removed from
schema, migration, dump_shots query, and tests. Old DBs still
have the columns sitting there harmlessly (no DROP COLUMN
migration — they take ~16 bytes per row, not worth the churn).click_x / click_y columns in shots.db — still useful per-shot
diagnostic info even if we don’t vary them.experiments config slot — useful framework for
future tests (just not these specific ones).common/predictor.py holds Predictor protocol +
KnnPredictor + BivariatePredictor + fit_knn + fit_bivariatecommon/shot_log.py shrunk: removed KnnPredictor and
fit_target_predictor. Added fetch_makes(conn, dir) which
returns the rows; callers pick a predictor and fit themselves.minigames/hoops/main.py has a PREDICTOR_KIND constant
("knn" or "bivariate"); call site picks the right fit_*.predictor_kind column added to shots.db so per-shot history
records which predictor produced the target_y.tests/test_predictor.py for the new module,
tests/test_shot_log.py slimmed to just logging concerns.