astrophotography/state/DECISIONS.md
Laurence 118dc36e92 solve: prefer the estate's own Astrometry.net over nova for blind solves
The estate now runs Astrometry.net itself (ankh-morpork-infra astrometry/):
solve-field against ~5 GB of local index files, sized from this repo's
TELESCOPES.md so the whole iTelescope fleet's fields of view are covered.

blind.py now tries it before nova.astrometry.net. Speed is the least of the
reasons - a blind solve of a real DSS field returns in 0.7s where nova queues
for minutes. The reasons that matter are that nova requires UPLOADING the
master to a third party and holding an API key, and neither is necessary any
more for the ordinary case. nova remains the fallback, so an estate outage
costs speed and privacy rather than the ability to solve.

pipeline/astrometry_net.py is the client and nothing more: stdlib-only POST,
parses the returned .wcs so the full TAN solution is used rather than a
re-derivation from the summary numbers. It deliberately does NOT decide whether
to trust a solution - blind.py already verifies every blind solve against Gaia
and applies a star-count and residual gate, and two gates that can disagree is
worse than one that is trusted.

The source ('estate' or 'nova') is threaded through the log lines, the returned
method, and the ASTRSOLV card, because a year from now that card is the only
way to tell whether a frame was solved in-house or uploaded.

Also corrected astrometry.py's 'cannot solve without a blind solver' message,
which has been untrue since run.py started falling through to blind.py.

Tested against the live service: blind solve of a DSS2 field with a known
centre returned within ~4 arcsec in 0.7s; the WCS round-trips through astropy;
and an unreachable service falls through to nova instead of raising.
2026-07-21 23:00:23 +01:00

6 KiB

Decisions

A dated, append only log of decisions and their rationale. Newest at the top. Never rewrite past entries; if a decision is reversed, add a new entry that says so.

2026-07-21: blind solving goes to the estate's own solver first, nova second

The estate now runs Astrometry.net itself (https://astrometry.ankh-morpork.discworld.network, config in ankh-morpork-infra astrometry/): solve-field against ~5 GB of local index files, sized from this repo's own TELESCOPES.md so it covers the whole iTelescope fleet's fields of view (21.5 arcmin to 10.4 degrees).

blind.py now tries it before nova.astrometry.net. The order is not about speed, though it is far faster - a blind solve of a real DSS field came back in 0.7s against nova's minutes-in-a-queue. It is that nova requires uploading the image to a third party and an API key, and neither is now necessary for the ordinary case. nova stays as the fallback for when the estate service is unreachable or the field is narrower than the local index set reaches, so losing the estate costs speed and privacy, not the ability to solve at all.

What deliberately did NOT change: the seeded solver in astrometry.py remains the primary path (a good header beats a blind search), and every blind solution

  • from either source - still has to pass the same Gaia verification and star-count/residual gate. A wrong WCS is worse than no WCS, and a second solver does not change that. The source is recorded in the ASTRSOLV card so it is always possible to tell later which one produced a frame's astrometry.

2026-07-21: the pipeline reads headers, not filenames

The first pipeline parsed calibrated-T32-...-Luminance-BIN2-W-300-001.fit to learn a frame's filter, binning and exposure. That works for one telescope, one binning and one exposure length. Three of the four archived sessions have no luminance channel at all and one is from 2021 with different naming, so the approach could not survive contact with the archive.

FITS headers carry FILTER, EXPTIME, XBINNING, OBJECT and DATE-OBS precisely so software does not have to guess, and iTelescope fills them in properly. The pipeline opens each frame and asks. Filter aliases are mapped, so H-alpha, Halpha and HA all resolve to Ha.

The colour scheme is then derived from what is present rather than assumed: LRGB, RGB without luminance, SHO, HOO, or mono. That is what lets one command handle a galaxy in LRGB and a nebula in narrowband without being told which is which.

2026-07-21: push-button imaging, hand-driven science

The imaging half - unzip, measure, register, stack, plate solve, compose - is mechanical and should run unattended on any session. The analyses are not: a globular cluster survey suits an elliptical galaxy and is meaningless for an emission nebula, and much of the value in the NGC 5128 work came from noticing when a result was wrong rather than from running the code. So the pipeline is being built to be push-button, and the science stays step by step.

2026-07-21: merge itelescope and astro-pipeline into one repository

The two were split by accident of chronology rather than by design. itelescope began as a reference to the telescope network and grew into the campaign that books and runs sessions; astro-pipeline was created three hours before this merge to hold the processing code once it was moved out of the image directory. They describe two halves of one activity, and the seam was already leaking: the campaign's TODO referred to processing results held in the other repo, and the processing code's README explained a campaign it did not contain.

Merged with both histories preserved, by relocating each repository's files into a subdirectory in its own history first and then merging the unrelated histories. 44 commits, and git log --follow still traces a file across the move.

Layout: itelescope/ for the network and campaign, pipeline/ for the code, observing/ for in-person plans, with the Default Workflow files (CLAUDE.md, docs/, state/) at the top level governing the whole repository.

The old repositories are not deleted. The drain campaign is live until 10 Aug with sessions running most nights, and other sessions may be working in itelescope at the moment of the merge. Both carry a notice pointing here. Archive them once the campaign closes, not before.

2026-07-21: image data does not live in the repository

A single calibrated frame is 61 MB and a session runs to several gigabytes. Sessions stay on disk, organised into named subdirectories, and the code finds them through the ASTRO_SESSION environment variable. Each session carries its own METHODS.md describing what was done and what was found, so the account of the data travels with the data while the code travels separately.

2026-07-17: follow the Google Sheet, not the support article

The support article (https://support.itelescope.net/support/solutions/articles/247371) and the maintained Google Sheet (https://docs.google.com/spreadsheets/d/1jZWkkjewOuyNC9YzQ8y2d0pO1e4T7EBeysmQMPBVSOk/) disagree: the article lists T9, T19, T31, T69, which the sheet omits; the sheet has T25, T26, T59, T71-T75, T80, which the article lacks. The article itself points to the sheet as the current source, so the review follows the sheet and notes the discrepancy. The sheet CSV export is snapshotted in data/ so the review's numbers remain reproducible even if the sheet changes.

2026-07-17: single review document, not per-telescope files

23 active scopes each need only a spec block and a short assessment; one TELESCOPES.md grouped by observatory reads better and is easier to keep current than 23 stub files. Revisit if per-scope content grows (photos, session logs).

2026-07-17: no launchpad scraping

https://go.itelescope.net/ is an authenticated app shell with no public data. All content comes from public support pages and the public sheet; nothing in this repo requires iTelescope credentials.

Per-telescope detail pages, if ever needed: support.itelescope.net/support/solutions/articles/231901-231920 (older scopes), 245471 (T68), 251171 (T70), 251556 (T69), 251589 (T19).