IDE4EEG 0.8.9

Post-0.8.8 retraction release.  0.8.8 was yanked from PyPI after the
macOS DMG hit a cryptic os.replace crash during L2CS weights download
on first launch.  This release fixes that plus a sweep of bugs
exposed by manual testing during the recovery cycle.

Fixed:
- L2CS-Net weights download robustness (lock + isfile check +
  size sanity, six regression tests).
- Stage 5 false-positive sweep: 8 consistency rules now gate on
  consumer-enabled (their downstream step must actually run).
- Stale step-hash pin survives re-loaded TOML (#21).
- torchvision _C.so / image.so rpath rewrite (gaze stack
  broken in full DMG when @loader_path/../torch/lib wasn't
  re-added after deleting the ec2-runner rpaths).
- ICA-eye loop-guard false positive when selector="manual" on
  re-entry (caught in user testing on the P300 dataset).
- Validator correctness pass on hard rules (filtering:<id>
  multi-instance, segmentation mode shape, STIM type-only).
- Dipole amp_range filter on legacy V-scale books.
- MP reconstruction / mp_filter amp_range on µV-native books.
- Event-name slash sanitization (#15).
- Manifest-vs-config UX guard.
- mne.utils.progressbar Windows frozen build.
- ChannelStatusBadge zombie cleanup (audit B7).

Changed:
- macOS .app names renamed inside DMGs: IDE4EEG.app (gaze)
  and IDE4EEG-nogaze.app (EEG core).  DMG filenames and bundle
  IDs unchanged.

Added:
- Seven numeric-range consistency rules.
- Pre-push hook now runs slow goldens unconditionally.
- pytest_configure warns when the pre-push hook isn't wired.
- scripts/smoke_test_dmg.sh + scripts/clean_room_smoke.sh.

See CHANGELOG.md for the full list with rationale.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>