Skip to content

Release 2.3.0 - #30

Merged
hd152 merged 5 commits into
mainfrom
hd152/release/2.3.0
Sep 23, 2026
Merged

hd152 merged 5 commits into
mainfrom
hd152/release/2.3.0

Conversation

@hd152

@hd152 hd152 commented Sep 23, 2026

Copy link
Copy Markdown
Owner

Summary

  • ZOGY real/bogus transient triage (--transient-triage): native CNN scoring of --transient-detect candidates, trained on synthetic + optionally real-mined data
  • Desktop app Cancel button (cooperative, checkpoints between Phase 1 frames and between targets)
  • --originvision on by default now (--no-originvision to disable); --originvision-workers default raised 2 -> 8 (measured 2.9x throughput)
  • Fix: --transient-detect no longer refuses two differently-shaped sessions of the same target
  • Test suite parallelized with pytest-xdist (measured 3.2x on a 16-core machine; CI wired, not the local default)

See CHANGELOG.md's [2.3.0] section for full details.

Test plan

  • Full suite passes locally (1665 passed)
  • pytest -n auto gives the same pass count (isolation verified)
  • Manual end-to-end runs: --no-originvision / default-on originvision, --transient-triage on real data, Cancel button smoke-tested
  • CI checks pass on this PR

hd152 and others added 5 commits September 23, 2026 06:27
--transient-triage scores each --transient-detect candidate with a small
CNN (new/ref/diff stamp triplet, native tract inference, advisory only --
never drops a candidate) for a real_probability, the same role ZTF's
BTSbot/Rubin's DIA triage play downstream of classical image differencing.
No amateur stacking tool does this today. The bundled model is trained
entirely on synthetic data (tools/gen_transient_triage_data.py + torch in
tools/train_transient_triage.py); tools/mine_real_transient_data.py adds a
real-data path -- stacks real multi-night sessions of the same target and
mines real cross-session negatives plus real-epoch-injection positives.

While validating the real-data path, found that two independently-stacked
sessions of the same target routinely differ in pixel dimensions (different
dither pattern, different Phase 3 crop), which run_transient_detection
treated as a hard failure -- a real limitation of the shipped
--transient-detect flag, not just the mining tool. Fixed by promoting
merge.py's shape-reconciliation helper to src.utils.embed_to_shape (shared
by both callers now) and carrying a real valid-data mask through the warp
so a zero-padded border reads as uncovered, not real reference data.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Cancel is cooperative (threading.Event on args._cancel_event), not a thread
kill -- CPython threads can't be force-stopped and Phase 1 workers are real
OS processes mid-computation anyway. RunCancelled (src/models.py) propagates
from a handful of checkpoints: frame_processor._check_cancel between Phase 1
frames in all three dispatch paths (ProcessPool/GPU-thread-pool/sequential,
with explicit cancel_futures=True shutdown so the wait is bounded to
whatever's already in flight, not the whole remaining session), and between
targets in cli.process_directory's multi-session loop. Phases 2-4 of a
single target aren't interruptible yet. RunManager reports a 'cancelled'
status distinct from 'error'; the desktop app shows a Cancel button next to
Start and a distinct "Cancelled" terminal state.

originvision perf, both measured on a real full-res frame before shipping:
--originvision-workers default 2->8 (near-linear scaling confirmed: 2751 ->
473 ms/frame effective at 8 workers, pure concurrency, zero accuracy risk).
Also built a pre-downsample step for score_rgb's preprocessing, which scales
with input pixel count even though only a 256x256 crop is ever used (85% of
a full-res call was spent on discarded pixels) -- up to 7x faster, but the
reject/quality heads proved genuinely resolution-sensitive (defect_probability
swung +0.04 to +0.40 depending on aggressiveness, enough to flip
is_defective near the boundary and feed auto_settings.py's defensive
nudges). Left off by default (score_rgb(..., fast_preprocess=True), unwired
to any CLI flag) rather than shipped as a silent accuracy/speed tradeoff.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
--originvision is on by default now; only --no-originvision exists to turn
it off (same no-positive-flag shape as --auto/--no-auto). A bare
--originvision on an old command line now errors rather than being a
no-op -- deliberate, since desktop_control.py's form-schema/argv machinery
keys purely on argparse dest with no dest-collision handling, so a
redundant positive flag alongside the new negative one would have silently
duplicated or dropped that GUI field.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
ZOGY real/bogus transient triage (--transient-triage), a desktop-app Cancel
button, originvision on by default with a measured 8-worker throughput
default, and a fix for --transient-detect refusing two differently-shaped
sessions of the same target.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Measured 3.2x on a 16-core machine (1665 tests, 169s -> 52s, no isolation
issues -- same pass count either way). Wired into both CI jobs. Not the
local default via pyproject.toml addopts: xdist's forked workers break
--pdb/breakpoint() and interleave -s output, so it stays an explicit
`-n auto` flag locally, documented in CLAUDE.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@hd152
hd152 merged commit e6cc3e5 into main Sep 23, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant